我为什么要使用&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}
}

最佳答案

好吧,他们会有不同的行为。本质上,如果要使用结构上的方法修改状态,则将需要一个指针,否则值会很好。也许一个例子会更好:

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

08-16 00:55