Skip to content

Instantly share code, notes, and snippets.

@CindyLinz
Created February 18, 2013 06:57
Show Gist options
  • Save CindyLinz/4975534 to your computer and use it in GitHub Desktop.
Save CindyLinz/4975534 to your computer and use it in GitHub Desktop.
初學 Go 的疑問~
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版適用範圍比較小..
@c9s
Copy link

c9s commented Feb 18, 2013

可以參考一下,在用 interface 的時候可以用參照符號轉換

如果實作是用 pointer 的話,就用參照符號

我大多 method 都是用 pointer 指到自己 (會比較省一點 I guess)

package main

import "fmt"

type A interface {
GetA()
}

type T struct {
    A int
}

func (t * T) GetA() {
    fmt.Println(t.A);
}

func main() {
    var t = T{}
    var t2 = &T{}

    t.GetA()
    t2.GetA()

    s := A(&t)
    s2 := A(t2)

    _ = s
    _ = s2
    _ = t2
    _ = t
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment