gpt4 book ai didi

go - 阐明对函数中参数处理的理解

转载 作者:行者123 更新时间:2023-12-01 22:36:26 25 4
gpt4 key购买 nike

为了一个简单的例子,假设我们使用下面的代码来读取 body http Get 请求:

func main() {
resp, err := http.Get("http://google.com")
defer resp.Body.Close()
if err != nil {
log.Fatalln(err)
}
bs := make([]byte, 99999)
resp.Body.Read(bs)
fmt.Println(string(bs))
}

据我所知,在 Go 中,变量按值传递给函数(因此函数使用传递值的副本而不是原始值本身);和 documentation of Go for Read method是:
type Reader interface {
Read(p []byte) (n int, err error)
}

根据文档, p []byte[]byte 类型而不是它的指针( []*byte );那么 resp.Body.Read 是怎么回事?方法是访问和编辑 bs变量本身直接(不是指针)?

最佳答案

reflect.SliceHeader 的 slice 类型定义

type SliceHeader struct {
Data uintptr
Len int
Cap int
}

虽然slice是一个值,但是值的地址指向一个指针,所以在展开之前可以把slice当作一个ptr属性。

Reader 接口(interface)修改 []byte 对象就像修改指针一样。最后,Read方法返回修改后数据的长度,长度为 n <= len(p) .

slice 触发追加扩展后,会创建一个新 slice 。新 slice 的数据地址与扩展地址不同。

在 Go 中,channels、maps 和 slices 保存了一个数据地址,因此它们都可以显示指针引用的性质;但是, slice append 方法在展开后会返回一个新的数据指针,并且会显示出类似的值传递属性。

关于go - 阐明对函数中参数处理的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61949568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com