引數和返回值裡面到底用指標還是value

astaxie發表於2016-10-31

Go 裡面有很多方式返回一個 struct 的值或者 slice,我們經常會看到的是如下的程式碼:

type MyStruct struct {
    Val int
}

func myfunc() MyStruct {
    return MyStruct{Val: 1}
}

func myfunc() *MyStruct {
    return &MyStruct{}
}

func myfunc(s *MyStruct) {
    s.Val = 1
}

我知道這三種方式的不同點,第一個返回一個 struct 的 copy,第二個在函式內部建立一個指向 struct 的指標然後返回,第三個是傳入一個已經存在的 struct,然後修改他的值。

我在很多原始碼裡面見過這三種不同的用法,我是想知道這個的最佳實踐是什麼?什麼時候應該用哪一種?例如第一種用在一些小的 struct(因為這個花費是最小的),第二種應用在大的 struct,而第三種可能就是為了非常的節約記憶體,因為你在不同的呼叫中重用 struct。

slice 的例子也是類似如下:

func myfunc() []MyStruct {
    return []MyStruct{ MyStruct{Val: 1} }
}

func myfunc() []*MyStruct {
    return []MyStruct{ &MyStruct{Val: 1} }
}

func myfunc(s *[]MyStruct) {
    *s = []MyStruct{ MyStruct{Val: 1} }
}
更多原創文章乾貨分享,請關注公眾號
  • 引數和返回值裡面到底用指標還是value
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章