首页 文章

Golang更新通过引用值传递

提问于
浏览
5

我正在调用一个函数来做一个http请求,两个通过引用参数用于该函数 . 我将[]字节传递给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 回答

  • 9

    嗯,这不起作用的主要原因是因为你想到了“通过参考调用”这个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)
    }
    

相关问题