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"。
为什么如果我在调用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"。