go - 通过引用分配

标签 go pass-by-reference

我在 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在解码之前。使用以下代码:

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)
}
Run it on the playground .

关于go - 通过引用分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64093884/

相关文章:

go - 在一个简单的、不返回的、非 panic 的函数中使用 defer 有什么好处吗?

angular - 无法使用Go lang设置Cookie

c++ - 这是通过引用传递文件指针的正确语法吗?

java - 在比较 Java 中的整数包装器时,为什么 128==128 为假,而 127==127 为真?

bash - 在程序开始时读取所有 stdin 会阻止在程序期间从 stdin 读取

pointers - Go struct literals,为什么这个是可寻址的?

assembly - Go 没有链接我的程序集 : undefined external function

ruby 和引用资料。使用 fixnums

c++ - std::string 如何管理这个技巧?

c# - 通过引用传递数据成员