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
}
你能詳細說明一下嗎?因此,將一個指針指向一個指針實際上什麼都不做?我會期待't = tt'賦值將'tt'的地址賦值爲't' – elimist3
變量't'是該方法中的一個指針變量。如果你改變了那個指針的值,你改變了它指向的內容,而不是它最初指向的內容。改變它指出的內容不會改變原始結構。 Go中的方法接收器與C++這樣的語言中的'this' /'self'指針不同,它們是任何其他值的變量。改變它們的唯一方法是傳播出函數,如果你改變它們指向的值。 – Kaedys
這可能會解釋:https://play.golang.org/p/tBCM0PfpEO。請注意,t中保存的地址在該方法中發生了變化,並指向已正確解組的結構,但由於您更改了「t」本身的值而不是它指向的值,所以該更改不會傳播出去。 – Kaedys