揭秘 Go 中的函式引數

banq發表於2024-12-10

在 Go 中,函式始終使用傳入引數的副本

func incrementScore(s int) {
    s += 10
}

func main() {
    score := 20
    incrementScore(score)
    fmt.Println(score) <font>// Still prints 20!<i>
}

如果您確實想更改這些值,主要有兩種方法可以實現:

1、對基本型別、結構和陣列使用指標引數:

func incrementScore(s *int) {
    *s += 10
}

func main() {
    score := 20
    incrementScore(&score)
    fmt.Println(score) <font>// Now prints 30!<i>
}

2、使用map、切片和通道,它們的行為因其內部工作方式不同而不同:

func addBonus(scores map[string]int) {
    for name := range scores {
        scores[name] += 10
    }
}

func main() {
    scores := map[string]int{<font>"Alice": 20}
    addBonus(scores)
    fmt.Println(scores)
// Prints map[Alice:30]<i>
}

但是使用時要注意切片的一個小怪癖append()。如果你想讓更改顯示在呼叫函式中,你必須使用指向切片的指標:

func addScores(s *[]int, values ...int) {
    *s = append(*s, values...)
}

func main() {
    scores := []int{10, 20}
    addScores(&scores, 30, 40)
    fmt.Println(scores) <font>// Prints [10 20 30 40]<i>
}

最大的注意:
Go 沒有真正的“引用型別”
完全取決於理解不同型別的內部構建方式。

  • 對映和通道基本上是內部指標,
  • 而切片是帶有指向陣列指標的結構。

相關文章