Interface 如何避免需要指针接收器的接口方法实现?
考虑以下示例: 不幸的是,我需要Interface 如何避免需要指针接收器的接口方法实现?,interface,go,Interface,Go,考虑以下示例: 不幸的是,我需要c=&Counter{},因为Counter.Increment()实现有一个指针接收器,否则c.Increment()调用将无法修改c.x属性: func (c Counter) Increment(){ c.i++ // no errors, but now we increment c.x having a copy of c as context } 如何在c=&Counter{}上使原始实现在没有&的情况下工作?换句话说,如何避免在C.Incr
c=&Counter{}
,因为Counter.Increment()
实现有一个指针接收器,否则c.Increment()
调用将无法修改c.x
属性:
func (c Counter) Increment(){
c.i++ // no errors, but now we increment c.x having a copy of c as context
}
如何在c=&Counter{}
上使原始实现在没有&
的情况下工作?换句话说,如何避免在C.Increment
实现中使用指针接收器
这只是一个小问题,但我认为在围棋中可能不需要指针
这只是一个小问题,但我认为在围棋中可能不需要指针
考虑到Go用于按值传递所有内容,指针接收器是实现所需内容的自然方式。这得到了以下方面的支持: 首先,也是最重要的,该方法是否需要修改接收器?如果是,则接收器必须是指针
你可以在“
< p>中找到类似的结论:你可以考虑定义一个<代码> NewCounter <代码>函数来封装你的类型(或第三方)的初始化,并返回一个<代码> *计数器< /代码>。用法可能如下所示:func main() {
c := NewCounter()
c.Increment()
fmt.Println(c)
}
因此,没有办法摆脱&
&计数器{}
初始化?这种担心的动机是,我发现在使用tirhd参与方包时,通过引用初始化结构非常不愉快,所以我尽量避免使用它。直到你看到编译错误,你才知道如何初始化。@marcioAlmada我理解,但我不知道当你有一个修改其内容的方法时,有什么自然的方法可以避免Go中的指针初始化。很好,我们在Go std libs中到处都能看到这种模式。
func main() {
c := NewCounter()
c.Increment()
fmt.Println(c)
}