Golang怎么实现方法集与接口的匹配_Golang如何理解值类型和指针类型实现接口的区别【详解】
Go中接口实现取决于类型的方法集值类型T仅含T接收者方法指针类型T同时含T和T接收者方法若接口方法含指针接收者则只有*T能实现该接口。方法集决定接口能否被实现Go 里接口能否被某个类型实现不看它有没有写 func (t T) Method()而看它的「方法集」是否包含接口要求的所有方法。值类型 T 和指针类型 *T 的方法集不同——这是所有困惑的根源。值类型 T 的方法集只包含接收者为 T 的方法指针类型 *T 的方法集则同时包含接收者为 T 和 *T 的方法。反过来不成立T 不能调用 *T 方法*T 却能调用 T 方法因为可取地址、可解引用。如果你定义了 func (t *T) Save()那只有 *T 满足 interface{ Save() }T 不满足如果你只定义了 func (t T) Read()那么 T 和 *T 都满足 interface{ Read() }常见错误传 T{} 给期望 interface{ Save() } 的函数报错 cannot use T{} (type T) as type Saver in argument to saveIt: T does not implement Saver (Save method has pointer receiver)什么时候必须用指针接收者实现接口当方法需要修改接收者状态时必须用指针接收者——这不是接口问题而是 Go 的值拷贝语义决定的。但一旦用了指针接收者就锁死了「只有指针能实现该接口」。典型场景包括结构体字段赋值、map/slice 内容变更、sync.Mutex 加锁等。比如 sync.Mutex 的 Lock() 和 Unlock() 都是 *Mutex 接收者所以你绝不能把 sync.Mutex{} 当作 Locker 接口值直接传——必须传 mu。立即学习“go语言免费学习笔记深入” 幻导航网 发现优质实用网站,开启网络探索之旅
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2590501.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!