2017-10-13 165 views
0

我已經實現了一個自定義JSON解組器,但由於某種原因它不會返回正確的值 - 所有字段都會返回零。自定義json unmarshaler返回空字段

例如:

type test struct { 
    t string 
} 


func New(data string) (*test, error) { 
    return &test{t: data}, nil 
} 

func (t *test) UnmarshalJSON(b []byte) error { 
     tt, err := New(string(b)) 
    if err != nil { 
     return err 
    } 
    t = tt 
    return nil 
} 

func main() { 
    str := `"hello"` 

    b := []byte(str) 
    t := &test{} 
    err := json.Unmarshal(b, t) 
    if err != nil { 
    fmt.Printf("unmarshal error occurred: %#v", err) 
    } 
    fmt.Printf("%#v", t) 
} 

https://play.golang.org/p/LuXkZQZHWz

上面的代碼顯示輸出:&main.test{t:""}
爲什麼沒有解組的字段?即&main.test{t:"hello"}

只有當我取消引用上面的指針時,才能得到期望的結果。

即 -

func (t *test) UnmarshalJSON(b []byte) error { 
     tt, err := New(string(b)) 
    if err != nil { 
     return err 
    } 
    *t = *tt 
    return nil 
} 

回答

1

你分配的局部變量t,指針test,局部變量tt的價值,也是一個指針test。這對原指針t指向的值沒有影響。你必須解引用指針來改變它指向的值,而不是改變本地指針本身:

*t = *tt 
+0

你能詳細說明一下嗎?因此,將一個指針指向一個指針實際上什麼都不做?我會期待't = tt'賦值將'tt'的地址賦值爲't' – elimist3

+0

變量't'是該方法中的一個指針變量。如果你改變了那個指針的值,你改變了它指向的內容,而不是它最初指向的內容。改變它指出的內容不會改變原始結構。 Go中的方法接收器與C++這樣的語言中的'this' /'self'指針不同,它們是任何其他值的變量。改變它們的唯一方法是傳播出函數,如果你改變它們指向的值。 – Kaedys

+0

這可能會解釋:https://play.golang.org/p/tBCM0PfpEO。請注意,t中保存的地址在該方法中發生了變化,並指向已正確解組的結構,但由於您更改了「t」本身的值而不是它指向的值,所以該更改不會傳播出去。 – Kaedys