2014-12-07 114 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

相關問題