這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
<< Go Web 編程>> 一書 第 52 頁說到:
Go 語言中 string,slice,map 這三種類型的實現機制類似指標,所以可以直接傳遞, 而不用取地址後傳遞指標。
這個說法套在 string 上, 是錯誤的。
package mainimport "fmt"func add1(a string) string {a = a + " simida"return a}func main() {x := "I am Jon"fmt.Println("x = ", x)x1 := add1(x)fmt.Println("x + 1 = ", x1)fmt.Println("x = ", x)/*output:x = I am Jonx + 1 = I am Jon simidax = I am Jon*/}
以上例子中 x 的值在調用函數add1()之後無變化.
package mainimport "fmt"func add1(a *string) string {*a = *a + " simida"return *a}func main() {x := "I am Jon"fmt.Println("x = ", x)x1 := add1(&x)fmt.Println("x + 1 = ", x1)fmt.Println("x = ", x)/*output:x = I am Jonx + 1 = I am Jon simidax = I am Jon simida*/}
採用指標傳遞, 則調用函數之後x值發生變化.
由此可見, string 類型的實現機制 並非 類似指標.
而 slice 和 map 的實現機制則類似指標, 所以不必取地址傳遞指標.
package mainimport "fmt"func add1(a []int) []int {for k, v := range a {a[k] = v + 1}return a}func main() {x := make([]int, 2, 6)fmt.Println("x = ", x)x1 := add1(x)fmt.Println("x + 1 = ", x1)fmt.Println("x = ", x)/*output:x = [0 0]x + 1 = [1 1]x = [1 1]*/}
package mainimport "fmt"func add1(a map[string]int) map[string]int {for k, v := range a {a[k] = v + 1}return a}func main() {x := map[string]int{"a": 0, "b": 0}fmt.Println("x = ", x)x1 := add1(x)fmt.Println("x + 1 = ", x1)fmt.Println("x = ", x)/*output:x = map[a:0 b:0]x + 1 = map[a:1 b:1]x = map[a:1 b:1]*/}