在 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 沒有真正的“引用型別”
完全取決於理解不同型別的內部構建方式。
- 對映和通道基本上是內部指標,
- 而切片是帶有指向陣列指標的結構。