我正在研究 golang,对于在值或指针上定义方法有点困惑。正如文档中提到的:
接下来是一致性。如果该类型的某些方法必须具有指针接收器,则其余方法也应该具有指针接收器,因此无论如何使用该类型,方法集都是一致的。有关详细信息,请参阅方法集部分。
如果我有一个类型T,它需要实现几个接口。一个接口中的方法需要使用指针接收器,而另一个接口中的方法可以与值接收器很好地配合。是否有必要更改所有接口中的所有方法以具有指针接收器?如果是这样,为什么?
这取决于 :)
您的类型 T 有两个方法集:
接收者 (t T) 的方法集,它是用接收者 (t T) 定义的所有方法
接收器 (t *T) 的方法集,它是具有接收器 (t *T) 的所有方法以及具有接收器 (t T) 的所有方法
因此,如果您有一个满足 T 的接口,那么它也满足 *T。(但反之则不然)
因此,如果您必须向类型添加 *T 接收器方法来满足接口,则无需将其他方法接收器更改为 *T,但您必须意识到现在只有 *T 满足该接口并且不是 T,其他接口可能都满足。
type fooer interface {
    foo()
}
type barer interface {
    bar()
}
type T struct {}
func (t T)foo(){}
func (t *T)bar(){}
var _ fooer = T{}  // ok
var _ barer = T{}  // NOT OK - won't compile
var _ barer = &T{} // ok
var _ fooer = &T{} // ok
Run Code Online (Sandbox Code Playgroud)
令人困惑?是的,可以。因此,尽管您不必更改所有方法来拥有指针接收器,但如果您这样做,它会更加一致并且不会那么混乱 - 这样您就知道您总是在代码中处理 *T - 而且它似乎是大多数人都会做什么。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1618 次  |  
        
|   最近记录:  |