https://beta.golang.org/doc/go1.8

package main

import (
        "fmt"
        "encoding/json"
)

func main() {
        type T1 struct {
                X int `json:"foo"`
        }
        type T2 struct {
                X int `json:"bar"`
        }
        var v1 T1
        var v2 T2
        v1 = T1(v2) // now legal

        var data = []byte(`{"foo": 1,"bar": 2}`)
        _ = json.Unmarshal(data, &v1)
        fmt.Printf("%+v\n", v1)

        _ = json.Unmarshal(data, &v2)
        fmt.Printf("%+v\n", v2)

        v1 = T1(v2) // now legal
        fmt.Printf("%+v\n", v1)
}

今までは上記のような、同じ構造体でも、タグが違えばコンバートエラーが出ていました。

$ go version
  go version go1.7.4 darwin/amd64
$ go run main.go
  ./main.go:17: cannot convert v2 (type T2) to type T1
  ./main.go:26: cannot convert v2 (type T2) to type T1

しかし最新の1.8からは

$ go run main.go
{X:1}
{X:2}
{X:2}

PlayGround と変換されるようになりました。 タグだけ変えたいのに、、、くそーがなくなったのはいいことですね

しかし公式にも書かれていますが

  When explicitly converting a value from one struct type to another, as of Go 1.8 the tags are ignored. Thus two structs that differ only in their tags may be converted from one to the other:

  明示的にある構造体の型から別の型に値を変換するとき、Go 1.8のようにタグは無視されます。したがって、タグだけが異なる2つの構造体は、一方から他方へと変換される可能性があります。

は注意が必要ですね