2015-11-08 66 views
4

是否有一个原因,我要创建一个使用&StructName{}代替Struct{}一个结构?我看到使用前语法的例子很多,甚至在Effective Go Page,但我真的不明白为什么。Golang - 与结构{}之间的差值Vs结构{}

其他注意事项: 我不知道我是否解释了我的问题,以及与这两种方法,所以让我改进我的问题。

我知道,通过使用&我将收到一个指针,而不是一个值的,但是我想知道为什么我会用&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} 
} 
+1

为向下票的原因吗? – linirod

回答

5

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

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

3

假设你知道指针和值之间的一般区别:

第一种方式分配一个结构体并将一个指向分配结构体的指针赋给变量p1

p1 := &StructName{} 

第二种方式分配一个结构,并分配一个值(该结构本身)到可变s。 然后一个指向结构可以被分配给另一个变量(p2在下面的示例中)。

s := StructName{} 
p2 := &s 
+0

感谢您的快速回复,但这不是我的问题。我更新了这个问题。 – linirod