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

时间:2016-01-15 03:11:58

标签: go

我是Go编程的新手,想知道

之间有什么区别(如果有的话)

一个。

func DoSomething(a *A) {        
      b = a
}

func DoSomething(a A) {     
    b = &a
}

3 个答案:

答案 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是可执行证明。