解组时动态识别类型

时间:2019-05-06 20:04:24

标签: go unmarshalling

如何动态返回特定子类型的结构?例如,在以下情况下。什么是正确的解组方法,以便我可以对结果数据调用适当的operate()方法?需要说明的是,从数据结构的角度来看,addermultiplier完全相同。因此,除了Operation string之外,它们的JSON将完全相同。从绑定到它们的功能集来看,它们也完全相似。它们仅在这些函数内部的应用程序逻辑上不同。如何确保将正确的功能动态地绑定到我的数据上(同时进行封送处理)?

我的想法: 在Go中这应该是不可能的,因为我们需要静态地知道unmarshal方法返回的内容的类型。但是我很想知道是否存在基于接口的魔术来解决此问题。

package main

import (
    "encoding/json"
    "fmt"
)

type base struct {
    A         int64
    B         int64
    Operation string
}

type multiplier struct {
    base
}

type adder struct {
    base
}

func (mu *multiplier) operate() int64 {
    return mu.A * mu.B
}

func (ad *adder) operate() int64 {
    return ad.A + ad.B
}

func main() {
    x := new(adder)
    x.A = 3
    x.B = 2
    x.Operation = "adder"
    e, _ := json.Marshal(x)
    other(e)
    //y := other(e)
    //y.operate()
}

func other(b []byte) interface{} {
    var x interface{}
    json.Unmarshal(b, &x)
    fmt.Println(x)
    return x
}

0 个答案:

没有答案