我正在寫一些程式碼,其中許多函數更新「透過引用傳遞」的項目,沿著下面的DoSomethingB
的行。作為新手,這對我來說相當不直觀。我寧願讓一個函數返回其結果(除非它可能是方法並更新接收器)。
問題:
DoSomethingB
等模式是否有一個很好的論點
通過 DoSomethingA
? DoSomethingB
(不是結構體方法)
Go 中被認為是好的或可接受的風格嗎? package main import ( "fmt" ) func DoSomethingA(someData int) int { return someData + 23 } func DoSomethingB(someData *int) { *someData = *someData + 23 } func DoSomethingC(someData *int) *int { tmp := *someData + 23 return &tmp } func main() { someDataA := 19 someDataB := 19 someDataC := 19 fmt.Printf("1) someDataA=%d, someDataB=%d, someDataC=%d\n", someDataA, someDataB, someDataC) someDataA = DoSomethingA(someDataA) DoSomethingB(&someDataB) someDataC = *DoSomethingC(&someDataC) fmt.Printf("2) someDataA=%d, someDataB=%d, someDataC=%d\n", someDataA, someDataB, someDataC) }
去遊樂場連結:https://play.golang.com/p/ELwljCaWDLg
DoSomethingB 與DoSomethingA:如果您想要修改原始變數而不建立副本,則使用DoSomethingB 這樣的模式會很有幫助,從而避免不必要的分配。但是,它可能會導致程式碼更難理解。使用
DoSomethingA(傳回結果)通常在 Go 中更慣用,並且通常出於可讀性考慮而首選。
DoSomethingB 在 Go 中被認為是好的風格嗎? :雖然在 Go 中看到類似 DoSomethingB 的程式碼並不罕見,特別是在處理大型資料結構時,Go 的慣用方式鼓勵傳回值修改指標。使用指標直接修改值(尤其是對於整數等內建類型)可能會導致程式碼難以理解。
DoSomethingC 將被視為不符合語法,因為它會傳回指向局部變數的指標。這可能會導致未定義的行為,因為在函數返回後記憶體位置可能會被重複用於其他用途。最好避免這種模式。
DoSomethingA 這樣的模式。如果您有充分的理由修改原始資料並且擔心效能(例如大型資料結構),那麼
DoSomethingB 是可以接受的。
以上是Go回傳值、回傳引用、什麼都不回傳什麼時候用什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!