乐趣区

关于golang:Golang-结构体指针接口实现笔记

对函数来说,参数为 struct、*struct

首先定义 struct cat 如下

type Cat struct {name string}

并申明如下两个函数

func changeName1(c Cat, name string) {c.name = name}

func changeName2(c *Cat, name string) {c.name = name}
func main() {c := Cat{"aaa"}
   changeName1(c, "bbb")
   fmt.Println(c)
   changeName2(&c, "ccc")
   fmt.Println(c)
}
// 输入后果
// {aaa}
// {ccc}

论断:

  • 对于函数而言,参数中 构造体和构造体指针 是齐全两个类型,会产生重载。
  • 构造体参数会齐全复制一份,包含构造体外部的字段。
  • 构造体指针参数会将指针齐全复制一份,构造体内的字段还是会专用。

对办法来说,接收者为 struct、*struct

func (c Cat) sayHello() {fmt.Printf("hello everyone, i am %s", c.name)
}

func (c Cat) changeName(name string) {fmt.Printf("i am %s, change my name to %s\n", c.name, name)
   c.name = name
   fmt.Printf("cat 指针:%p, cat.name 指针:%p\n", &c, &(c.name))
}

func (c *Cat) changeName2(name string) {fmt.Printf("i am %s, change my name to %s\n", c.name, name)
   c.name = name
   fmt.Printf("cat 指针:%p, cat.name 指针:%p\n", &c, &(c.name))
}
func main() {c := Cat{"aaa"}
   fmt.Printf("cat 指针:%p, cat.name 指针:%p\n", &c, &(c.name))
   (&c).changeName2("bbb")
   fmt.Println(c)
}
// 代码输入
// cat 指针:0xc0000461f0, cat.name 指针:0xc0000461f0
// i am aaa, change my name to bbb
// cat 指针:0xc000006030, cat.name 指针:0xc0000461f0
// {bbb}

论断:

  • 办法的接收者为指针或者对象,表现形式与 函数的参数为指针或对象 基本一致
  • 不论是指针还是对象,均会将接收者复制一份

接口的指针实现和值实现

type Animal interface {sayHello()
}

func (c *Cat) sayHello() {fmt.Printf("hello everyone, i am %s", c.name)
}

论断:

  • 值实现的接口,能够通过值或者指针 对接口类型变量赋值
  • 指针实现的接口,只能通过指针 对接口类型的变量赋值。

剖析:

func main () {var an Animal = &Cat{"aaa"}
    an.sayHello()}

上述申明语句,其实蕴含两个过程:

  1. 初始化 Cat 构造体变量。
  2. 将 Cat 对象,转换成接口类型,此处须要进行一次拷贝,接口中持有了对象。
  3. 值对象赋值给指针实现的接口时,先产生一次拷贝,再取指针,取到的指针不是实在地址,故无奈进行转换。
退出移动版