如何动态返回特定子类型的结构?例如,在以下情况下。什么是正确的解组方法,以便我可以对结果数据调用适当的operate()
方法?需要说明的是,从数据结构的角度来看,adder
和multiplier
完全相同。因此,除了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
}