我有理由使用& 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运行它