Golang更新传递引用值

6

我正在调用一个函数进行http请求,使用两个通过引用传递的参数。我将[]byte传递给v接口。我希望该函数能够更新v接口引用值。响应正文是一个字符串,我想将字符串值传递给v接口。然而,尝试了很多方法都没有成功。

下面是代码,你可以看到我声明bytsv.(*[]byte),以便让v与响应体的字符串值一起更新。但它不起作用。 v始终为nil。请建议任何方法使v能够更新为字符串值。

func (s *BackendConfiguration) Do(req *http.Request, v interface{}) error {
    res, err := s.HTTPClient.Do(req)
    defer res.Body.Close()
    resBody, err := ioutil.ReadAll(res.Body)

    if v != nil {   
            byts, ok := v.(*[]byte)
            if len(resBody) > 0 {           
                byts = append(byts, resBody...)
                return nil
            }
        }
    }

    return nil
}

1
为什么不返回(interface {},err)?这样你就可以在追加后使用return byts,nil - serejja
2
我只想指出这仍然是按值传递... 被复制的值是指针... 而不是它所指向的内容... #挑剔 - Simon Whitehead
2
请展示调用Do()方法的代码。同时请检查ok变量。但是您传递的值v很可能不是*[]byte类型! - icza
1个回答

10

嗯,这不起作用的主要原因是您考虑了“按引用调用”这个 Go 完全不了解的概念。在 Go 中,绝对所有东西都是按值传递的,一旦您说明了什么是字节切片、指向字节切片的指针、包装在接口中的字节切片的指针、从接口提取出字节切片指针的副本等等,就会看到如何更新指向字节切片的指针的值:

package main
import "fmt"
func f(v interface{}) {
    pbs := v.(*[]byte)
    *pbs = append(*pbs, []byte{9,8,7}...)
}
func main() {
    bs := []byte{1,2,3}
    pbs := &bs
    var v interface{} = pbs
    f(v)
    fmt.Printf("%v\n", *pbs)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接