为了账号安全,请及时绑定邮箱和手机立即绑定

golang中的这些函数有什么区别?

golang中的这些函数有什么区别?

Go
料青山看我应如是 2021-12-07 10:30:49
我是 Go 编程的新手,想知道它们之间有什么区别(如果有的话)一种。func DoSomething(a *A) {              b = a}湾func DoSomething(a A) {         b = &a}
查看完整描述

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)

}


查看完整回答
反对 回复 2021-12-07
?
一只甜甜圈

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)

}

这是可执行的证明。


查看完整回答
反对 回复 2021-12-07
?
森林海

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 个值,而且它是不可变的,所以它的所有实例共享相同的内存地址?


查看完整回答
反对 回复 2021-12-07
  • 3 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信