为什么map
在Go上有不同的行为?
Go中的所有类型都按值复制:string
,intxx
,uintxx
,floatxx
,struct
,[...]array
,{{ 1}}除了[]slice
map[key]value
将变量作为函数的参数/参数传递等于赋值package main
import "fmt"
type test1 map[string]int
func (t test1) DoSomething() { // doesn't need to use pointer
t["yay"] = 1
}
type test2 []int
func (t* test2) DoSomething() { // must use pointer so changes would effect
*t = append(*t,1)
}
type test3 struct{
a string
b int
}
func (t* test3) DoSomething() { // must use pointer so changes would effect
t.a = "aaa"
t.b = 123
}
func main() {
t1 := test1{}
u1 := t1
u1.DoSomething()
fmt.Println("u1",u1)
fmt.Println("t1",t1)
t2 := test2{}
u2 := t2
u2.DoSomething()
fmt.Println("u2",u2)
fmt.Println("t2",t2)
t3 := test3{}
u3 := t3
u3.DoSomething()
fmt.Println("u3",u3)
fmt.Println("t3",t3)
}
:=
答案 0 :(得分:3)
Map values are pointers。类似地,一些其他类型(切片,字符串,通道,函数)用指针实现。有趣的是,链接的FAQ条目说明了
早期,地图和通道是语法指针,无法声明或使用非指针实例。 ...最终我们决定严格分离指针和值使语言更难使用。
" Go by value"表示作为常规函数传递的变量args不会被被调用的函数修改。这并没有改变一些内置类型可以包含指针(就像你自己的结构一样)。
Python类似:f(x)
不会更改传递给它的整数x
,但它可以附加到列表x
,因为Python列表是通过内部指针实现的。相比之下,C ++具有可用的实际传递:f(x)
如果声明int x
具有参考参数f
,则可以更改调用者void f(int& x)
})。
(我还在另一个问题的答案中写了一些general info on pointers vs. values in Go,如果有帮助的话。)