-3

为什么如果我 print bs,在调用之前Read(),它什么也不打印,但是在调用之后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.
4

1 回答 1

0

除非 bs 只是参数,否则 Read() 如何更改它?

看来您可能总体上缺少有关编程语言的基本知识。有不同种类的“价值观”。有指针(或引用),也有“常用值”。

例如:

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是指向 的(类型*int)指针a。将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是“原始值”并且[]T是“指针值”。

于 2018-06-14T06:57:12.603 回答