美文网首页
23 Golang中的接口(三)

23 Golang中的接口(三)

作者: learninginto | 来源:发表于2021-04-07 09:50 被阅读0次
    结构体值接收者和指针接收者实现接口的区别

    值接收者

    如果结构体中的方法是值接收者,那么实例化后的结构体值类型和指针类型都可以赋值给接口变量

    指针接收者

    如果结构体中的方法是指针接收者,那么只有实例化后的指针类型可以赋值给接口变量,结构体值类型不能赋值给接口变量

    • demo

    定义一个Animal接口,Animal中有两个方法,分别是SetName和GetName,分别让Gog结构体和Cat结构体实现接口中的方法

    type Animaler interface {
        SetName(string)
        GetName() string
    }
    
    type Dog struct {
        Name string
    }
    
    func (d *Dog) SetName(name string) {
        d.Name = name
    }
    
    func (d *Dog) GetName() string {
        return d.Name
    }
    
    type Cat struct {
        Name string
    }
    
    func (c *Cat) SetName(name string){
        c.Name = name
    }
    
    func (c Cat) GetName() string {
        return c.Name
    }
    
    func main() {
    //  Dog实现Animal接口
        d := &Dog{
            Name:"二狗",
        }
        var d1 Animaler = d
        fmt.Println(d1.GetName())
        d1.SetName("阿奇")
        fmt.Println(d1.GetName())
    
    //  Cat实现Animal接口
        c := &Cat{
            Name:"花花",
        }
        var c1 Animaler = c
        fmt.Println(c1.GetName()
    //二狗
    //阿奇
    //花花
    }
    
    • 一个结构体实现多个接口
    type Animaler1 interface {
        SetName(string)
    }
    
    type Animaler2 interface {
        GetName() string
    }
    
    type Dog struct {
        Name string
    }
    
    func (d *Dog) SetName(name string) {
        d.Name = name
    }
    
    
    func (d *Dog) GetName() string {
        return d.Name
    }
    
    type Cat struct {
        Name string
    }
    
    func (c *Cat) SetName(name string){
        c.Name = name
    }
    
    func (c Cat) GetName() string {
        return c.Name
    }
    
    func main() {
        d := &Dog{
            Name:"二狗",
        }
        //让dog实现Animaler1接口
        var d1 Animaler1 = d
        //让dog实现Animaler2接口
        var d2 Animaler2 = d
        d1.SetName("小花狗")
        fmt.Println(d2.GetName())
    }
    
    接口嵌套

    在Golang中允许接口嵌套,实现新接口

    
    type Ainterface interface {
        SetName(string)
    }
    
    type Binterface interface {
        GetName() string
    }
    
    //接口嵌套
    type Animaler interface {
        Ainterface
        Binterface
    }
    type Dog struct {
        Name string
    }
    
    func (d *Dog) SetName(name string) {
        d.Name = name
    }
    
    func (d *Dog) GetName() string {
        return d.Name
    }
    
    func main() {
        //让dog实现Animaler接口
        d := &Dog{
            Name:"二狗",
        }
        var d1 Animaler = d
        d1.SetName("小花狗")
        fmt.Println(d1.GetName())
    }
    

    切片/结构体赋值给空接口类型的对象,不能直接获取到切片/结构体中具体的某个值

    type Address struct {
        Name string
        Phone int
    }
    
    func main() {
        var userInfo = make(map[string]interface{})
        userInfo["userName"] = "张三"
        userInfo["age"] = 20
        userInfo["hobby"] = []string{"吃饭","睡觉","打豆豆"}
        fmt.Println(userInfo["age"])
        fmt.Println(userInfo["hobby"])
        //fmt.Println(userInfo["hobby"][1])
        //interface{} does not support indexing 空接口类型不支持索引
    
        hobby2,_ := userInfo["hobby"].([]string)
        fmt.Println(hobby2[1])//睡觉
    
        var address = Address {
            Name:"李四",
            Phone:13912345678,
        }
        fmt.Println(address.Name)//李四
    
        userInfo["address"] = address
        fmt.Println(userInfo["address"])//{李四 13912345678}
        //var name = userInfo["address"].Name
        //type interface {} is interface with no methods空接口中没有name方法
    
        address2,_ := userInfo["address"].(Address)
        fmt.Println(address2.Name)//李四
    }
    

    相关文章

      网友评论

          本文标题:23 Golang中的接口(三)

          本文链接:https://www.haomeiwen.com/subject/ldbykltx.html