如何避免需要指针接收器的接口方法实现?

时间:2014-12-07 09:36:07

标签: interface go

请考虑以下示例:http://play.golang.org/p/eAot_sVwND

package main

import "fmt"

type Incrementor interface {
    Increment()
}

type Counter struct {
    i int

    Incrementor
}

func (c *Counter) Increment(){
    c.i++
} 

func main() {
    var c Incrementor
    c = &Counter{}
    c.Increment()
    fmt.Println(c)  
}

不幸的是,我需要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中可能没有必要使用指针。

2 个答案:

答案 0 :(得分:4)

  

这只是一个问题,但我认为在Go中可能没有必要使用指针。

考虑到Go用于通过 value 传递所有东西,指针接收器是实现你想要的自然方式。
Go FAQ

支持此功能
  

首先,最重要的是,该方法是否需要修改接收器?如果是,接收器必须是指针。

你会在" Things I Wish Someone Had Told Me About Golang: pointers"

中找到类似的结论

答案 1 :(得分:2)

您可以考虑定义一个NewCounter函数来封装您的类型(或某些第三方)的初始化并返回*Counter。用法可能如下所示:

func main() {
    c := NewCounter()
    c.Increment()
    fmt.Println(c)  
}