我看过一些类似的问题(Same method on different array types in Go)
但在我的情况下,我的函数不会返回相同的类型。
您能更简单地编写以下代码吗?
package main
import (
"encoding/json"
"fmt"
)
type A struct {
Name string `json:"name"`
Age int `json:"age"`
}
type B struct {
Name string `json:"name"`
Age int `json:"age"`
Address string `json:address`
}
func UnmarshalA(b []byte) *A {
var t *A
_ = json.Unmarshal(b, &t)
return t
}
func UnmarshalB(b []byte) *B {
var t *B
_ = json.Unmarshal(b, &t)
return t
}
func main() {
a := []byte(`{"name": "aaaa", "age": 1}`)
unmarshal_a := UnmarshalA(a)
fmt.Println(unmarshal_a.Name)
b := []byte(`{"name": "bbbb", "age": 2, "address": "b@example.com"}`)
unmarshal_b := UnmarshalB(b)
fmt.Println(unmarshal_b.Name)
}
// aaaa
// bbbb
答案 0 :(得分:1)
你有几个选择。
请勿使用UnmarshalA
和UnmarshalB
。
他们真的没有做太多事情,你真的只是抽出一条线...... var t *A
如果您实际上不需要A
和B
结构,并且只想以您可以使用它的方式表示JSON字符串的内容,那么您可以将其解组为map[string]interface{}
。
E.g。
package main
import (
"encoding/json"
"fmt"
)
func UnmarshalAny(b []byte) map[string]interface{} {
var t = make(map[string]interface{})
_ = json.Unmarshal(b, &t)
return t
}
func main() {
a := []byte(`{"name": "aaaa", "age": 1}`)
unmarshal_a := UnmarshalAny(a)
b := []byte(`{"name": "bbbb", "age": 2, "address": "b@example.com"}`)
unmarshal_b := UnmarshalAny(b)
// Accessed like this...
fmt.Println(unmarshal_a["name"])
fmt.Println(unmarshal_b["name"])
}
https://play.golang.org/p/KaxBlNsCDR
如果您想通过引用传递数据,那么您可以将其更改为以下内容:
package main
import (
"encoding/json"
"fmt"
)
func UnmarshalAny(b []byte) *map[string]interface{} {
var t = make(map[string]interface{})
_ = json.Unmarshal(b, &t)
return &t
}
func main() {
a := []byte(`{"name": "aaaa", "age": 1}`)
unmarshal_a := UnmarshalAny(a)
b := []byte(`{"name": "bbbb", "age": 2, "address": "b@example.com"}`)
unmarshal_b := UnmarshalAny(b)
// Accessed like this...
fmt.Println((*unmarshal_a)["name"])
fmt.Println((*unmarshal_b)["name"])
}