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}
结论:
- 对于函数而言,参数中 结构体和结构体指针 是完全两个类型,会发生重载。
- 结构体参数会完全复制一份,包括结构体内部的字段。
- 结构体指针参数会将指针完全复制一份,结构体内的字段还是会公用。
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()
}
【Golang 结构体、指针、接口实现笔记】上述声明语句,其实包含两个过程:
- 初始化Cat结构体变量。
- 将Cat对象,转换成接口类型,此处需要进行一次拷贝,接口中持有了对象。
- 值对象赋值给指针实现的接口时,先发生一次拷贝,再取指针,取到的指针不是真实地址,故无法进行转换。
推荐阅读
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 人生两件宝(好身体,好心情!)
- 人如果没梦想,和咸鱼有什么区别(自媒体时代把握住就能咸鱼翻身)
- 绘本讲师训练营【18期】14/21《我的情绪小怪兽》故事会新体验
- 一个健康的APP和健全的人格大体类似
- 自媒体形势分析
- 2019-03-27健康减肥126天
- 20190320《个体崛起》
- 美之初体验—我所感受到的那一点儿
- 人工智能|干货!人体姿态估计与运动预测