自定义json unmarshaler返回空字段

I've implemented a custom JSON unmarshaler, but for some reason it won't return the proper value -all fields come back nil.

For example:

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

The above code shows the output: &main.test{t:""}
Why doesn't it unmarshal the fields? i.e &main.test{t:"hello"}

Only when I dereference the pointers above, do I get the desired result.

i.e -

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

You're assigning the local variable t, a pointer to test, to the value of the local variable tt, also a pointer to test. This has no effect on the value the original pointer t pointed to. You have to dereference the pointers to change the value it points to, rather than changing the local pointer itself:

*t = *tt