3 回答
TA贡献1795条经验 获得超7个赞
如果您真的要问它们的区别是什么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)
}
TA贡献1836条经验 获得超5个赞
变量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)
}
这是可执行的证明。
TA贡献2011条经验 获得超2个赞
通常,这两个函数会给 分配不同的值b。第二个复制参数,因此a函数内部通常具有与传递给函数的任何输入不同的内存地址。请参阅此游乐场示例
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改为空结构,并 initialize var a = A{},您实际上会在语句中看到相同的值。bprintln
那是因为对于空结构类型,实际上只能有 1 个值,而且它是不可变的,所以它的所有实例共享相同的内存地址?
- 3 回答
- 0 关注
- 212 浏览
添加回答
举报