2015-11-08 108 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