&Struct{}与Struct{}之间的区别

14

为什么我应该使用&StructName{}创建结构体,而不是Struct{}?我看到很多示例都使用前一种语法,即使在Effective Go Page中也是如此,但我真的不明白为什么。

附加说明: 我不确定用这两种方法是否能清楚地表达我的问题,所以让我精炼一下我的问题。

我知道通过使用&,我将得到一个指针而不是值,但我想知道为什么要使用&StructName{}而不是StructName{}。例如,使用它有什么好处:

func NewJob(command string, logger *log.Logger) *Job {
    return &Job{command, logger}
}

改为:

func NewJob(command string, logger *log.Logger) Job {
    return Job{command, logger}
}
2个回答

19

它们将有不同的行为。如果您想使用结构体上的方法修改状态,则需要指针,否则值就可以了。也许一个例子会更好:

package main
import "fmt"



type test_struct struct {
  Message string
}

func (t test_struct)Say (){
   fmt.Println(t.Message)
}

func (t test_struct)Update(m string){
  t.Message = m; 
}

func (t * test_struct) SayP(){
   fmt.Println(t.Message)
}

func (t* test_struct) UpdateP(m string)  {
  t.Message = m;
}

func main(){
  ts := test_struct{}
  ts.Message = "test";
  ts.Say()
  ts.Update("test2")
  ts.Say() // will still output test

  tsp := &test_struct{}
  tsp.Message = "test"
  tsp.SayP();
  tsp.UpdateP("test2")
  tsp.SayP() // will output test2

}

你可以在这里运行它 Go Playground


7
假设您已经了解指针和值的一般区别:
第一种方式会分配一个结构体,并将指向该分配的结构体的指针赋给变量p1
p1 := &StructName{}

第二种方式是分配一个结构体并将值(即结构体本身)分配给变量 s。然后可以将指向该结构体的指针分配给另一个变量(在下面的示例中是p2)。
s := StructName{}
p2 := &s

谢谢您的快速回复,但那不是我的问题。我已经更新了问题。 - linirod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接