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)  
}