23 Golang中的接口(三)

learninginto · · 113 次点击 · · 开始浏览    

结构体值接收者和指针接收者实现接口的区别

值接收者

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

指针接收者

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

  • 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)//李四
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:learninginto

查看原文:23 Golang中的接口(三)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

113 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传