Go Read()工作怎么样?戈兰尼
为什么如果我打印bs,在调用Read之前,它什么也不打印,但是在调用file.Readbs之后,它显示test.txt文件的内部。除非bs是唯一的参数,否则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
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以了解所有这些。