我是Go编程的新手,想知道
之间有什么区别(如果有的话)一个。
func DoSomething(a *A) {
b = a
}
湾
func DoSomething(a A) {
b = &a
}
答案 0 :(得分:3)
如果您实际上在询问那些b
的区别是什么,一个是指向作为DoSomething
的参数传递的对象的指针,另一个是指向作为参数传递给DoSomething
的对象的副本。
https://play.golang.org/p/ush0hDZsdE
type A struct {
f string
}
func DoSomethingPtr(a *A) {
b := a
b.f = "hi"
}
func DoSomething(a A) {
b := &a
b.f = "hey"
}
func main() {
x := A{"hello"}
DoSomething(x)
fmt.Println(x)
DoSomethingPtr(&x)
fmt.Println(x)
}
答案 1 :(得分:0)
通常,这两个函数会为b
指定不同的值。第二个创建参数的副本,因此函数内的a
通常具有与传递给函数的任何输入不同的内存地址。见this playground example
package main
type A struct{
x int
}
var b *A
func d(a *A) {
b = a
}
func e(a A) {
b = &a
}
func main() {
var a = A{3}
println(&a)
d(&a)
println(b)
e(a)
println(b)
}
有趣的是,如果您将类型A
改为空结构,并初始化var a = A{}
,您实际上会在b
中看到{em>相同的值{ {1}}陈述。
那是因为对于空结构类型,实际上只有1个值,并且它是不可变的,所以它的所有实例共享相同的内存地址?
答案 2 :(得分:0)
变量b
将在每个函数中分配不同的值。值不同,因为一个传递复制的值而另一个传递指针指向内存中的原始值。
package main
import "fmt"
type A string
func DoSomethingPtr(a *A) {
fmt.Println(a)
}
func DoSomething(a A) {
fmt.Println(&a)
}
func main() {
x := A("hello")
DoSomething(x)
DoSomethingPtr(&x)
}
Here是可执行证明。