Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reference 关于使用等号和地图的说明_Reference_Go - Fatal编程技术网

Reference 关于使用等号和地图的说明

Reference 关于使用等号和地图的说明,reference,go,Reference,Go,为什么map在旅途中有不同的行为 Go中的所有类型都是按值复制的:string,intxx,uintxx,floatxx,struct,[…]数组,[]切片,除了映射[键]值 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*

为什么
map
在旅途中有不同的行为

Go中的所有类型都是按值复制的:
string
intxx
uintxx
floatxx
struct
[…]数组
[]切片
,除了
映射[键]值

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)
}
将变量作为函数的参数/参数传递等于赋值
:=

package main

import "fmt"
type test1 map[string]int

func DoSomething1(t test1)  { // doesn't need to use pointer
   t["yay"] = 1
}

type test2 []int

func DoSomething2(t *test2) { // must use pointer so changes would effect
    *t = append(*t,1)
}

type test3 struct{
    a string
    b int
}

func DoSomething3(t *test3) { // must use pointer so changes would effect
    t.a = "aaa"
    t.b = 123
}

func main() {
 t1 := test1{}
 DoSomething1(t1)
 fmt.Println("t1",t1)

 t2 := test2{}
 DoSomething2(&t2)
 fmt.Println("t2",t2)

 t3 := test3{}
 DoSomething3(&t3)
 fmt.Println("t3",t3)
}
。类似地,其他一些类型(切片、字符串、通道、函数)也是用指针实现的。有趣的是,链接的FAQ条目说

早期,映射和通道在语法上是指针,不可能声明或使用非指针实例。。。最终我们决定,指针和值的严格分离使语言更难使用

“按值传递”意味着作为常规函数args传递的变量不会被调用函数修改。这并没有改变某些内置类型可以包含指针(就像您自己的结构一样)

Python与此类似:
f(x)
不会更改传递给它的整数
x
,但它可以附加到列表
x
,因为Python列表是通过内部指针实现的。相比之下,C++具有实际的可供参考:<代码> f(x)< /> >可以更改调用方的<代码> int x <代码>,如果<代码> f>代码>被声明为具有引用参数(<代码>空格f(int x)< /> >)。 (如果有帮助的话,我在回答另一个问题时也写了一些。)。类似地,其他一些类型(切片、字符串、通道、函数)也是用指针实现的。有趣的是,链接的FAQ条目说

早期,映射和通道在语法上是指针,不可能声明或使用非指针实例。。。最终我们决定,指针和值的严格分离使语言更难使用

“按值传递”意味着作为常规函数args传递的变量不会被调用函数修改。这并没有改变某些内置类型可以包含指针(就像您自己的结构一样)

Python与此类似:
f(x)
不会更改传递给它的整数
x
,但它可以附加到列表
x
,因为Python列表是通过内部指针实现的。相比之下,C++具有实际的可供参考:<代码> f(x)< /> >可以更改调用方的<代码> int x <代码>,如果<代码> f>代码>被声明为具有引用参数(<代码>空格f(int x)< /> >)。 (如果有帮助的话,我在回答另一个问题时也写了一些。)。类似地,其他一些类型(切片、字符串、通道、函数)也是用指针实现的。有趣的是,链接的FAQ条目说

早期,映射和通道在语法上是指针,不可能声明或使用非指针实例。。。最终我们决定,指针和值的严格分离使语言更难使用

“按值传递”意味着作为常规函数args传递的变量不会被调用函数修改。这并没有改变某些内置类型可以包含指针(就像您自己的结构一样)

Python与此类似:
f(x)
不会更改传递给它的整数
x
,但它可以附加到列表
x
,因为Python列表是通过内部指针实现的。相比之下,C++具有实际的可供参考:<代码> f(x)< /> >可以更改调用方的<代码> int x <代码>,如果<代码> f>代码>被声明为具有引用参数(<代码>空格f(int x)< /> >)。 (如果有帮助的话,我在回答另一个问题时也写了一些。)。类似地,其他一些类型(切片、字符串、通道、函数)也是用指针实现的。有趣的是,链接的FAQ条目说

早期,映射和通道在语法上是指针,不可能声明或使用非指针实例。。。最终我们决定,指针和值的严格分离使语言更难使用

“按值传递”意味着作为常规函数args传递的变量不会被调用函数修改。这并没有改变某些内置类型可以包含指针(就像您自己的结构一样)

Python与此类似:
f(x)
不会更改传递给它的整数
x
,但它可以附加到列表
x
,因为Python列表是通过内部指针实现的。相比之下,C++具有实际的可供参考:<代码> f(x)< /> >可以更改调用方的<代码> int x <代码>,如果<代码> f>代码>被声明为具有引用参数(<代码>空格f(int x)< /> >)。 (如果有帮助的话,我在回答另一个问题时也写了一些。)