澄清在Go上使用等号和地图

时间:2014-12-04 02:07:09

标签: reference go

为什么map在Go上有不同的行为?

Go中的所有类型都按值复制:stringintxxuintxxfloatxxstruct[...]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) }

:=

1 个答案:

答案 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,如果有帮助的话。)