指针实现接口与结构体实现指针的区别?

指针实现接口与结构体实现指针的区别?

问题描述:

为什么指针实现接口时,只有指针类型的变量才会实现该接口;而使用结构体实现接口时,指针类型和结构体类型都会实现该接口?

相关代码:

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,但是这样为什么会“指针类型和结构体类型都会实现该接口”呢?

正在回答

登陆购买课程后可参与讨论,去登陆

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
    也就是说,只是语法层面做了一些语法糖,使用结构体实现接口时,代码自动生成了指针类型和结构体类型的接口实现,对吗?
    2021-06-06 20:23:40
  • Xargin 回复 提问者 拧壶冲 #2

    是的,你可以看看最后的汇编结果,其实是帮你生成了对应的 method 的

    2021-06-07 03:06:25
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师