Created
February 18, 2013 06:57
-
-
Save CindyLinz/4975534 to your computer and use it in GitHub Desktop.
初學 Go 的疑問~
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Go 裡面有 struct, 還有指向 Struct 的指標. | |
就是.. 有這樣的東西: | |
type T struct { | |
A int | |
} | |
var t T | |
var p *T | |
然後, 於這兩種 type 要 access member 的時候語法一樣, 也就是: | |
t.A | |
和 | |
p.A | |
這部分是前言, 只有這部分的話沒有問題~ :p | |
Go 裡面 struct 的「member method」的定義是這樣: | |
func (self T) value() int { | |
return self.A | |
} | |
然後就可以 | |
t.value() | |
和 | |
p.value() | |
也可以定 *struct 的 member method, | |
這樣就可以讓 method 改到 struct 的內容, | |
而如果 struct 巨大的時候, 也可以避免 copy. | |
寫法跟 struct member method 幾乎一樣, | |
只是把 self 那邊的 T 改成 *T | |
而且, 定義了 *T 的 member method 以後, | |
T 和 *T 都可以用, 也都是 t.value() 這樣用. | |
我有發現, T 的 member method 和 *T 的 member method 不可以同時定義兩個同名的. | |
可能是因為如果兩個都定義了, go 在呼叫 member method 的時候, | |
就無法分辨是要呼叫哪一個版本的. | |
這邊.. 也暫且接受... | |
接下來, 引入 interface 以後, 我開始困惑了.. | |
因為如果我實作的是 T版 的 member method, 那麼 T 和 *T 都可以指定給 interface; | |
如果如果我實作的是 *T版 的 member method, 那麼就只有 *T 可以指定給 interface.. | |
一般你們是怎麼選擇的呢? | |
因為 T 和 *T 的 member method 只能選一邊定義, | |
T版比較吃資源, *T比較省資源; | |
而在遇到 interface 的時候, T版的適用範圍比較大, *T版適用範圍比較小.. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
可以參考一下,在用 interface 的時候可以用參照符號轉換
如果實作是用 pointer 的話,就用參照符號
我大多 method 都是用 pointer 指到自己 (會比較省一點 I guess)