请考虑以下示例: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中可能没有必要使用指针。
答案 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)
}