指针实现接口与结构体实现指针的区别?
问题描述:
为什么指针实现接口时,只有指针类型的变量才会实现该接口;而使用结构体实现接口时,指针类型和结构体类型都会实现该接口?
相关代码:
type Animal interface {
Eat()
}
type Dog struct{}
// 结构体指针实现
func (d *Dog) Eat() {
fmt.Println("dog eat")
}
// 结构体实现
func (d Dog) Eat() {
fmt.Println("dog eat")
}
调用代码:
// 指针变量调用
d := &Dog{}
d.Eat()
// 结构体变量调用
d := Dog{}
d.Eat()
能理解 d调用时,因为函数调用时都是值传递,所以会复制一个指针,而结构体变量时会赋值一个变量d,但是这样为什么会“指针类型和结构体类型都会实现该接口”呢?
29
收起
正在回答
1回答
Go 里面有很多特性其实是编译器的功劳。例如对 map 取值既可以返回 ok,也可以不返回 ok,这是编译器分析后调用的不同的底层 map 的取值函数。
这里其实也是编译器的功劳,真要想探索到底是哪些代码做的事,可以用 ide 调试一番,参考一下其他班学员刚写的一篇探索文章:https://blog.csdn.net/zxxshaycormac/article/details/117606285
个人觉得没太大必要啥都要怼到源码,有些就是简单的语法糖而已。
再贴一篇相关的文章也可以看看:https://www.qcrao.com/2019/04/25/dive-into-go-interface/#2-%E5%80%BC%E6%8E%A5%E6%94%B6%E8%80%85%E5%92%8C%E6%8C%87%E9%92%88%E6%8E%A5%E6%94%B6%E8%80%85%E7%9A%84%E5%8C%BA%E5%88%AB
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星