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)< /> >)。
(如果有帮助的话,我在回答另一个问题时也写了一些。)