<< Go Web 编程>> 一书 第 52 页说到:
Go 语言中 string,slice,map 这三种类型的实现机制类似指针,所以可以直接传递, 而不用取地址后传递指针。
这个说法套在 string 上, 是错误的。
package main import "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 Jon x + 1 = I am Jon simida x = I am Jon */ }
以上例子中 x 的值在调用函数add1()之后无变化.
package main import "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 Jon x + 1 = I am Jon simida x = I am Jon simida */ }
采用指针传递, 则调用函数之后x值发生变化.
由此可见, string 类型的实现机制 并非 类似指针.
而 slice 和 map 的实现机制则类似指针, 所以不必取地址传递指针.
package main import "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 main import "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] */ }