有人可以在Go中解释这个界面示例吗?

From http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go there an example illustrating a possible use of interfaces in Go. Code as below:

  package main


  import (
      "encoding/json"
      "fmt"
      "reflect"
      "time"
  )

  // start with a string representation of our JSON data
  var input = `
  {
      "created_at": "Thu May 31 00:00:01 +0000 2012"
  }
  `
  type Timestamp time.Time

  func (t *Timestamp) UnmarshalJSON(b []byte) error {
    v, err := time.Parse(time.RubyDate, string(b[1:len(b)-1]))
    if err != nil {
        return err
    }
    *t = Timestamp(v)
    return nil
  }

  func main() {
    // our target will be of type map[string]interface{}, which is a pretty generic type
    // that will give us a hashtable whose keys are strings, and whose values are of
    // type interface{}
    var val map[string]Timestamp

    if err := json.Unmarshal([]byte(input), &val); err != nil {
        panic(err)
    }

    fmt.Println(val)
    for k, v := range val {
        fmt.Println(k, reflect.TypeOf(v))
    }
    fmt.Println(time.Time(val["created_at"]))
  }

with a result like this:

map[created_at:{63474019201 0 0x59f680}]
created_at main.Timestamp
2012-05-31 00:00:01 +0000 UTC

I am struggling to understand how the function call

json.Unmarshal([]byte(input), &val){...}

relates to the method defined earlier

func (t *Timestamp) UnmarshalJSON(b []byte) error{...}

Reading the doc at http://golang.org/pkg/encoding/json/#Unmarshal is confusing me even more.

I am obviously missing something here, but I can't figure it out.

In Go an interface is implemented just by implementing its methods. It is so much different from the most other popular languages (Java, C#, C++) in which the class interfaces should be explicitly mentioned in the class declaration.

The detailed explanation of this concept you can find in the Go documentation: https://golang.org/doc/effective_go.html#interfaces

So the func (t *Timestamp) UnmarshalJSON(...) defines a method and in a same time implements the interface. The json.Unmarshal then type asserts the elements of val to the Unmarshaler interface (http://golang.org/pkg/encoding/json/#Unmarshaler) and call the UnmarshalJSON method to construct them from the byte slice.