为了账号安全,请及时绑定邮箱和手机立即绑定

Reader 界面更改值

Reader 界面更改值

Go
慕慕森 2021-10-04 09:40:55
我有一个关于阅读器界面的问题,定义如下:type Reader interface {    Read(p []byte) (n int, err error)}我有以下使用阅读器界面的代码:package mainimport (    "fmt"    "os")// Reading files requires checking most calls for errors.// This helper will streamline our error checks below.func check(e error) {    if e != nil {        panic(e)    }}func main() {    // You'll often want more control over how and what    // parts of a file are read. For these tasks, start    // by `Open`ing a file to obtain an `os.File` value.    f, err := os.Open("configuration.ini")    check(err)    // Read some bytes from the beginning of the file.    // Allow up to 5 to be read but also note how many    // actually were read.    b1 := make([]byte, 10)    n1, err := f.Read(b1)    check(err)    fmt.Printf("%d bytes: %s\n", n1, string(b1))    f.Close()}如您所见,上面的代码b1被定义为字节切片,并将其Read作为值参数传递给方法。在Read方法之后,b1包含文件中的前 10 个字母。对我来说,上面的代码非常令人困惑的是,为什么b1在Read方法之后突然包含值。在 Golang 中,当我向方法传递值时,它将作为值传递而不是作为引用传递。为了澄清,我在说什么,我做了一个示例应用程序:package mainimport (    "fmt")func passAsValue(p []byte) {    c := []byte("Foo")    p = c}func main() {    b := make([]byte, 10)    passAsValue(b)    fmt.Println(string(b))}在passAsValue函数之后,b不包含任何值,并且我在 golang 中期望的是,参数将作为值传递给函数或方法。那么,为什么第一个代码片段可以更改传递参数的内容?如果该Read方法需要[]byte切片指针,那么我会同意,但在这种情况下不会。
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

一切都是按值传递的(通过创建被传递值的副本)。

但是,由于在Go切片只是描述符用于底层数组中,描述符将被复制,这将是指相同的底层数组,因此,如果在修改的连续段内容的切片的,相同的基本阵列被修改。

如果在函数中修改了切片值本身,那不会在调用处体现出来,因为切片值只是一个副本,副本会被修改(不是原始的切片描述符值)。

如果你传递一个指针,指针的值也是按值传递的(指针值会被复制),但在这种情况下,如果你修改了指向的值,那将与调用处相同(复制指针和原始指针指向同一个对象/值)。


查看完整回答
反对 回复 2021-10-04
  • 3 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信