2 回答
TA贡献1793条经验 获得超6个赞
目标是b在解组之前设置字段的类型。使用以下代码:
func get(data []byte, r interface{}) error {
res := struct {
A string
B interface{}
}{
B: r,
}
return json.Unmarshal(data, &res)
}
像这样称呼它:
func main() {
var b string
get([]byte(`{"a": "XYZ", "b": "Nobody"}`), &b)
fmt.Println(b)
var i int
get([]byte(`{"a": "XYZ", "b": 10}`), &i)
fmt.Println(i)
}
TA贡献1817条经验 获得超6个赞
您正在将interface{}
值传递给您的get
函数。由于它是按值传递的,因此您的r = &res.b
赋值将覆盖函数中的值,这对引用中包含的值没有影响。
换句话说:
r
一个interface{}
指的是一个指针
指向 a
string
或 aint
。
您的代码修改本地值r
以引用指向 astring
或a 的新指针int
,忽略并丢弃传入的原始指针。
如果要修改指针的目标,则需要访问它。在您的接口类型上使用类型转换(例如if rstringptr, ok := r.(*string); ok { ... }
或类型开关)以获取其中引用的适当类型的值。这甚至可以让您简化 API,因为您不需要在单独的参数中提供类型。例如:
import "fmt"
func get(iface interface{}) {
switch concrete := iface.(type) {
case *string:
*concrete = "Nobody"
case *int:
*concrete = 10
}
}
func main() {
var b string
get(&b)
fmt.Println(b)
var i int
get(&i)
fmt.Println(i)
}
https://play.golang.org/p/JyYRjH9Dchj
Nobody
10
- 2 回答
- 0 关注
- 83 浏览
添加回答
举报