Go Read()工作怎么样?戈兰尼

Go Read()工作怎么样?戈兰尼,go,go-packages,Go,Go Packages,为什么如果我打印bs,在调用Read之前,它什么也不打印,但是在调用file.Readbs之后,它显示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, s

为什么如果我打印bs,在调用Read之前,它什么也不打印,但是在调用file.Readbs之后,它显示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.
除非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))


} 
看起来您可能缺少一般编程语言的基本知识。有不同的价值观。有指针或引用,也有通常的值

例如:

package main

import (
    "fmt"
)

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

func main() {
    a := 1
    fmt.Println(a)
    changeIt(&a)
    fmt.Println(a)
}
它将打印19而不是11*int不是整数,而是指向整数的指针。指针是指向引用另一个值的值。如果您有一个类型为pointer的值,您可以使用*获得指针指向的实际值,这称为解引用:

func main() {
    a := 1
    b := &a
    fmt.Println(b, *b)
}
b是指向a的*int类型指针。println将打印a的位置,后跟a的值,该值通常类似于uhm 0x10414020 1。我们还可以使用*p=…,修改指针指向的值:

将打印0x10414020 9

现在,[]字节是一个片。。。切片就像指针。当你这样做的时候

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

func main() {
    data := []byte{1,2,3}
    changeIt(data)
    fmt.Println(data)
}
实际上,您并没有传递值[1 2 3]来更改它,而是传递一个指向这些值的指针。因此这里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],而不是指针,因此它基本上在副本上工作,而buf[0]=10没有效果。记住:[n]T是一个数组,[]T是一个切片。[n] T是原始值,[]T是指针值

从文件中读取字节。缓冲区开始为空,并由Read调用填充。请浏览Go以了解所有这些。