【发布时间】:2020-09-27 22:27:56
【问题描述】:
我被 Go 中的一个小任务引用问题困住了。我试图在下面的代码中模仿这个问题。
package main
import (
"encoding/json"
"fmt"
)
type tRes struct {
a string
b interface{}
}
func get(t string, r interface{}) error {
var res tRes
switch t {
case "string":
res = tRes{
a: "XYZ",
b: "Nobody",
}
case "int":
res = tRes{
a: "XYZ",
b: 10,
}
}
// r = &res.b
j, _ := json.Marshal(res.b)
json.Unmarshal(j, &r)
return nil
}
func main() {
var b string
get("string", &b)
fmt.Println(b)
var i int
get("int", &i)
fmt.Println(i)
}
在代码中,get 方法根据类型返回一个值。如果我使用 r = &res.b 它不起作用,而 j, _ := json.Marshal(res.b) json.Unmarshal(j, &r) 起作用。我不想像在实际代码中那样对一个非常大的对象执行 json marshal 和 unmarshal,我正在调用一个返回大对象的 API。我执行 json unmarshal 来创建主对象,然后将一个子对象(定义为 interface{})分配给响应(可能是不同的类型)作为对我不起作用的参考。
【问题讨论】:
-
您的目标是在解组之前设置字段类型
b吗?如果是这样,请参阅play.golang.org/p/mLznJZX7gB2。 -
@MuffinTop right 这就是我想要的,它解决了问题。
标签: go pass-by-reference