<< 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语言中string、slice和map三种类型的行为差异,特别指出string的值传递特性,并演示了slice和map类似指针的传递方式。

被折叠的 条评论
为什么被折叠?



