lin*_*rod 6 struct pointers initialization go difference
有没有理由我应该使用&StructName{}而不是Struct{}?我看到许多使用前一种语法的例子,即使在Effective Go页面中,但我真的不明白为什么.
附加说明:我不确定我是否用这两种方法很好地解释了我的问题,所以让我提炼我的问题.
我知道通过使用&我将收到指针而不是值,但我想知道为什么我会使用&StructName{}而不是StructName{}.例如,使用有什么好处:
func NewJob(command string, logger *log.Logger) *Job {
return &Job{command, logger}
}
Run Code Online (Sandbox Code Playgroud)
代替:
func NewJob(command string, logger *log.Logger) Job {
return Job{command, logger}
}
Run Code Online (Sandbox Code Playgroud)
好吧,他们会有不同的行为.本质上,如果你想使用结构上的方法修改状态,那么你将需要一个指针,否则一个值就可以了.也许一个例子会更好:
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
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里跑去游乐场
小智 5
假设您知道指针和值之间的一般区别:
第一种方法分配一个结构,并为该变量分配一个指向该已分配结构的指针p1。
p1 := &StructName{}
Run Code Online (Sandbox Code Playgroud)
第二种方法分配一个结构并为该变量分配一个值(该结构本身)s。然后可以将指向该结构的指针分配给另一个变量(p2在以下示例中)。
s := StructName{}
p2 := &s
Run Code Online (Sandbox Code Playgroud)