os.Read() 工作怎么样?戈朗

os.Read() How is work? Golang

为什么如果我在调用Read()之前打印bs,它什么都不打印,但是在调用file.Read(bs)之后,它显示了test.txt文件的内部。除非 bs 只是参数,否则 Read() 怎么改变它?

package main
import (
"os"
"fmt"
)

func main() {
    file , err := os.Open("test.txt")
if err == nil {
} else {

}
stat , _ := file.Stat()


bs := make([]byte, stat.Size())
fmt.Println(string(bs))
bsf ,err := file.Read(bs)

if err != nil{
    fmt.Println(err)
    fmt.Println(bsf)
}
fmt.Println(string(bs))


} 

输出:

(Line1)                                           
(Line2)hi, This is Example text in test.txt file.

Unless bs is only argument, how Read() can Change it?

看来您可能缺少一般编程语言的基本知识。有不同种类的"values"。有指针(或引用)和 "usual values".

例如:

package main

import (
    "fmt"
)

func changeIt(p *int) {
    *p = 9
}

func main() {
    a := 1
    fmt.Println(a)
    changeIt(&a)
    fmt.Println(a)
}

它将打印 1 9 而不是 1 1*int 不是一个整数,而是一个指向整数的指针。指针是指向(引用)另一个值的值。如果您有一个指针类型的值,您可以使用 *(称为解引用)获得指针指向的实际值:

func main() {
    a := 1
    b := &a
    fmt.Println(b, *b)
}

b 是指向 a 的指针(*int 类型)。 println 将打印 a 的位置,后跟 a 的值,通常类似于 uhm 0x10414020 1。我们还可以使用 *p = ...:

修改指针指向的值
func main() {
    a := 1
    b := &a
    *b = 9
    fmt.Println(b, *b, a)
}

这将打印 0x10414020 9 9.

现在,[]byte 是一个切片...切片就像指针。当你这样做时

func changeIt(buf []byte) {
    buf[0] = 10
}

func main() {
    data := []byte{1,2,3}
    changeIt(data)
    fmt.Println(data)
}

您实际上并不是将值 [1 2 3] 传递给 changeIt,而是传递指向这些值的指针。因此这里 println 将显示 [10 2 3]。将此与以下内容进行比较:

func changeIt(buf [3]byte) {
    buf[0] = 10
}

func main() {
    data := [3]byte{1,2,3}
    changeIt(data)
    fmt.Println(data)
}

它将打印 [1 2 3] 并且它将传递值 [1 2 3] 而不是指针,因此 changeIt 本质上适用于副本并且 buf[0] = 10 无效。记住:[n]T 是一个数组,[]T 是一个切片。 [n]T 是 "raw value" 而 []T 是 "pointer value"。