首頁 >後端開發 >Golang >Go回傳值、回傳引用、什麼都不回傳什麼時候用什麼

Go回傳值、回傳引用、什麼都不回傳什麼時候用什麼

王林
王林轉載
2024-02-05 23:24:031054瀏覽

Go回傳值、回傳引用、什麼都不回傳什麼時候用什麼

問題內容

我正在寫一些程式碼,其中許多函數更新「透過引用傳遞」的項目,沿著下面的DoSomethingB 的行。作為新手,這對我來說相當不直觀。我寧願讓一個函數返回其結果(除非它可能是方法並更新接收器)。

問題:

  1. 使用 DoSomethingB 等模式是否有一個很好的論點 通過 DoSomethingA
  2. 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


#正確答案


##當然,讓我們分解一下您的問題:

  1. DoSomethingB 與DoSomethingA:如果您想要修改原始變數而不建立副本,則使用DoSomethingB 這樣的模式會很有幫助,從而避免不必要的分配。但是,它可能會導致程式碼更難理解。使用 DoSomethingA(傳回結果)通常在 Go 中更慣用,並且通常出於可讀性考慮而首選。

  2. DoSomethingB 在 Go 中被認為是好的風格嗎? :雖然在 Go 中看到類似 DoSomethingB 的程式碼並不罕見,特別是在處理大型資料結構時,Go 的慣用方式鼓勵傳回值修改指標。使用指標直接修改值(尤其是對於整數等內建類型)可能會導致程式碼難以理解。

範例

DoSomethingC 將被視為不符合語法,因為它會傳回指向局部變數的指標。這可能會導致未定義的行為,因為在函數返回後記憶體位置可能會被重複用於其他用途。最好避免這種模式。

總之,如果您想遵循慣用的 Go,請更喜歡

DoSomethingA 這樣的模式。如果您有充分的理由修改原始資料並且擔心效能(例如大型資料結構),那麼 DoSomethingB 是可以接受的。

以上是Go回傳值、回傳引用、什麼都不回傳什麼時候用什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除