美文网首页
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中的接口(三)

    结构体值接收者和指针接收者实现接口的区别 值接收者如果结构体中的方法是值接收者,那么实例化后的结构体值类型和指针类...

  • Go 学习笔记 11 | Golang 接口详解

    一、Golang 接口 Golang 中接口定义了对象的行为规范,只定义规范不实现。接口中定义的规范由具体的对象来...

  • golang分层测试之http接口测试入门

    前言 本节主要讲使用golang进行接口测试,其中主要以http协议的接口测试来讲 golang中的http请求 ...

  • golang中interface底层分析

    golang中的接口分为带方法的接口和空接口。带方法的接口在底层用iface表示,空接口的底层则是eface表示。...

  • Golang 中的接口 (interface)

    依赖于接口而不是实现,优先使用组合而不是继承,这是程序抽象的基本原则。Golang 中的 interface 让编...

  • 19年第34周:Go语言 有趣的接口

    一、Golang的接口 Go语言接口设计很符合设计原则参考图灵丛书中的《设计模式》 当我看到Golang的接口时,...

  • 接口 interface golang

    原文链接:接口 interface-GOLANG

  • golang中反射与接口的关系

    在golang中interface底层分析文中分析了接口的底层原理。其中接口的内部结构分两种一种是iface接口,...

  • Go-Interface

    Go 接口 Interface定义 在golang中,接口是一种抽象类型,接口可理解为一组方法的集合。跟Struc...

  • 21 Golang中的接口(一)

    Golang中接口定义了对象的行为规范,只定义规范不实现。接口中定义的规范由具体的对象来实现。 每个接口由数个方法...

网友评论

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

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