在Go中,即使[]字节通过值传递给方法,原始值仍会被修改?

在Go中,即使[]字节通过值传递给方法,原始值仍会被修改?,go,Go,通常,只有当原始值作为指向方法的指针传递时,它才会更改。 但是我看到了这样一种场景,当原始值作为值传递给方法时,它会发生变化。这在阅读器接口的实现中经常发生 例如: 包干管 进口 fmt 木卫一 串 func main{ r:=strings.NewReaderHello,读者! b:=make[]字节,8 为了{ n、 错误:=r.Readb fmt.Printfn=%v err=%v b=%v\n,n,err,b fmt.Printfb[:n]=%q\n,b[:n] 如果err==io.EO

通常,只有当原始值作为指向方法的指针传递时,它才会更改。 但是我看到了这样一种场景,当原始值作为值传递给方法时,它会发生变化。这在阅读器接口的实现中经常发生

例如:

包干管 进口 fmt 木卫一 串 func main{ r:=strings.NewReaderHello,读者! b:=make[]字节,8 为了{ n、 错误:=r.Readb fmt.Printfn=%v err=%v b=%v\n,n,err,b fmt.Printfb[:n]=%q\n,b[:n] 如果err==io.EOF{ 打破 } } } 使用value将变量b传递给Read方法

n、 错误:=r.Readb 但不知何故,原始值发生了变化,并填充了要打印的数据

如果我研究Read方法的实现

func r*读卡器Readb[]字节n int,错误{ 如果r.i>=int64lenr.s{ 返回0,io.EOF } r、 prevRune=-1 n=copyb,r.s[r.i:] r、 i+=int64n 回来 } 我们可以清楚地看到它是一个值参数? 这遵循了所有内容如何通过值进行传递和复制

根据我的理解,b至少应该像

func r*读卡器Readb*[]字节n int,错误{ 为什么会这样?请帮忙,谢谢

切片不直接保存其内容,而是保存指向其底层数组的指针,该数组保存切片的内容

因此,本质上是的,您是通过值传递的,但是值是一个指针,指向支持数组


请参阅:

再次阅读并浏览Go,其中解释了什么是切片以及切片的行为。是的,谢谢。我忘记了切片的实际实现。谢谢