我尝试在 go 中编写简单的消息协议,但遇到了问题。我有很多消息类型,我想要一个这样的字典来处理消息:


var dict map[reflect.Type]int = map[reflect.Type]int{

    reflect.TypeOf(DataMessage{}):          1000,

    reflect.TypeOf(TextMessage{}):          1001,

    //....

}


func GetMessageTypeId(value interface{}) int {

    if id, ok := dict[reflect.TypeOf(value)]; ok {

        return id

    } else {

        return -1

    }

}


func GetValueByTypeId(typeId int) interface{} {

    for typeDec, id := range dict {

        if id == typeId {

            return reflect.Zero(typeDec).Interface()

        }

    }

    fmt.Println("Unknown message type", typeId)

    return nil

}

它工作正常,但是当我使用 GetValueByTypeId 实例化消息并尝试将 json 解组到其中时 - 我收到的是 map[string]interface 而不是我的消息。我做了一个简单的例子来重现这个问题:


http://play.golang.org/p/QEyDN9vztr