2014-12-07 109 views
2

请看下面的例子: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

了类似的结论,您可以考虑定义NewCounter函数封装你的类型的初始化(或第三方),并返回一个*Counter。用法看起来像这样:

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

不错,我们看到这个模式遍布在std libs中。 – marcio 2014-12-07 17:08:31

4

这只是一个小问题,但我认为也许一个指针在Go中没有必要这样做。

考虑Go使用由传递一切,指针接收器是实现你想要的自然方式。
这是由Go FAQ支持:

首先,也是最重要的,做的方法,需要修改接收器?如果是这样,接收器必须是一个指针。

你会发现在“Things I Wish Someone Had Told Me About Golang: pointers

+0

所以没有办法摆脱&'&Counter {}'初始化? – marcio 2014-12-07 09:46:22

+1

这个问题的动机是,我发现使用tirhd派对包时通过引用初始化结构是相当不愉快的,所以我尽量避免使用它。你直到看到编译错误时才会知道如何初始化事物。 – marcio 2014-12-07 09:52:25

+1

@marcioAlmada我明白,但我不知道在Go中有一种自然的方式来避免指针初始化,当你有一个修改其内容的方法时。 – VonC 2014-12-07 10:01:23

相关问题