猿问

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

我是 Go 编程的新手,想知道它们之间有什么区别(如果有的话)


一种。


func DoSomething(a *A) {        

      b = a

}


func DoSomething(a A) {     

    b = &a

}


料青山看我应如是
浏览 213回答 3
3回答

一只萌萌小番薯

如果您真的要问它们的区别是什么b,一个是指向作为参数传递给 的对象的指针,另一个是指向作为参数传递给 的对象DoSomething副本的指针DoSomething。https://play.golang.org/p/ush0hDZsdEtype 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)}

一只甜甜圈

变量b将在每个函数中分配不同的值。这些值是不同的,因为一个传递复制的值,另一个传递指向内存中原始值的指针。package mainimport "fmt"type A stringfunc DoSomethingPtr(a *A) {    fmt.Println(a)}func DoSomething(a A) {    fmt.Println(&a)}func main() {    x := A("hello")    DoSomething(x)    DoSomethingPtr(&x)}这是可执行的证明。

森林海

通常,这两个函数会给 分配不同的值b。第二个复制参数,因此a函数内部通常具有与传递给函数的任何输入不同的内存地址。请参阅此游乐场示例package maintype A struct{    x int}var b *Afunc 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 个值,而且它是不可变的,所以它的所有实例共享相同的内存地址?
随时随地看视频慕课网APP

相关分类

Go
我要回答