go语言接口赋值与方法集详解
本文深入探讨go语言接口赋值机制,尤其关注lessadder接口赋值时方法集和方法生成问题。
go语言接口赋值的核心是方法集的概念。假设有如下代码:
type integer int func (a integer) less(b integer) bool { return a < b } type lessadder interface { less(b integer) bool add(b integer) } func (a *integer) add(b integer) { *a += b }
代码中,integer类型实现了lessadder接口。注意,less方法的接收者是integer,而add方法的接收者是*integer。将&a赋值给lessadder接口变量b时,不会自动生成新的less和add方法。
go语言方法集机制是关键。类型的“方法集”是指所有以该类型为接收者的方法。指针类型*t的方法集包含所有以t和*t为接收者的方法。因此,*integer类型的方法集包含integer类型的less方法和*integer类型的add方法。当&a(一个*integer)赋值给lessadder接口时,b可以调用less和add方法,正是因为*integer类型的方法集包含这两个方法。
文中提到的修改add方法的接收者为integer:
func (a integer) add(b integer) { a += b }
然后再次赋值:
var a integer = 1 var b lessadder = &a // (2) b.add(100) fmt.println(a) // 1
结果仍然是1,并非因为生成了新的方法func (a *integer) add(b integer) { (*a) += b }。这是因为,虽然b的静态类型是lessadder,但其动态类型是*integer。调用b.add(100)时,实际上执行的是integer类型的add方法。由于integer类型的add方法接收者是值类型,函数内对a的修改不会影响a的原始值,所以fmt.println(a)输出仍然是1。因此,go语言不会自动生成新方法来匹配接口,而是通过方法集机制实现接口的动态分发。go语言的接口是隐式实现的,不需要显式声明实现。
以上就是go语言接口赋值:方法集是如何影响lessadder接口赋值的?的详细内容,更多请关注代码网其它相关文章!
发表评论