地图键为结构时的元帅/非元帅问题

I defined a struct named Student and a map named score. Data structure is shown below:

type Student struct {
    CountryID int
    RegionID  int
    Name      string
}

stu := Student{111, 222, "Tom"}
score := make(map[Student]int64)
score[stu] = 100

i am using json.Marshal to marshal score into json, but i cannot use json.Unmarshal to unmarshal this json. Below is my code. i am using function GetMarshableObject to translate struct Student into string which is marshable. Could anyone tell me how to deal with this json to unmarshal it back to map score.

package main

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

type Student struct {
    CountryID int
    RegionID  int
    Name      string
}

func GetMarshableObject(src interface{}) interface{} {
    t := reflect.TypeOf(src)
    v := reflect.ValueOf(src)
    kind := t.Kind()
    var result reflect.Value
    switch kind {
    case reflect.Map:
        //Find the map layer count
        layer := 0
        cur := t.Elem()
        for reflect.Map == cur.Kind() {
            layer++
            cur = cur.Elem()
        }
        result = reflect.MakeMap(reflect.MapOf(reflect.TypeOf("a"), cur))
        for layer > 0 {
            result = reflect.MakeMap(reflect.MapOf(reflect.TypeOf("a"), result.Type()))
            layer--
        }
        keys := v.MapKeys()
        for _, k := range keys {
            value := reflect.ValueOf(GetMarshableObject(v.MapIndex(k).Interface()))
            if value.Type() != result.Type().Elem() {
                result = reflect.MakeMap(reflect.MapOf(reflect.TypeOf("a"), value.Type()))
            }
            result.SetMapIndex(reflect.ValueOf(fmt.Sprintf("%v", k)), reflect.ValueOf(GetMarshableObject(v.MapIndex(k).Interface())))
        }
    default:
        result = v
    }
    return result.Interface()
}

func main() {
    stu := Student{111, 222, "Tom"}
    score := make(map[Student]int64)
    score[stu] = 100

    b, err := json.Marshal(GetMarshableObject(score))
    if err != nil {
        fmt.Println("error:", err)
    }
    os.Stdout.Write(b) //{"{111 222 Tom}":100}

    scoreBak := make(map[Student]int64)
    if err = json.Unmarshal(b, &scoreBak); nil != err {
        fmt.Println("error: %v", err) // get error here: cannot unmarshal object into Go value of type map[main.Student]int64
    }
}

From the docs:

The map's key type must either be a string, an integer type, or implement encoding.TextMarshaler.

func (s Student) MarshalText() (text []byte, err error) {
    type noMethod Student
    return json.Marshal(noMethod(s))
}

func (s *Student) UnmarshalText(text []byte) error {
    type noMethod Student
    return json.Unmarshal(text, (*noMethod)(s))
}

As an example I'm using encoding/json to turn a Student value into a json object key, however that is not required and you can choose your own format.

https://play.golang.org/p/4BgZn4Y37Ww