<< 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]
*/
}
?
Go Web 编程 一书第52页中的错误: string 并非类似指针类型
原文:http://kanglecjr.iteye.com/blog/2176839