我有一个文件a.txt 里面的内容为 1,2,3,4,5,6,7 (每个数字单独一行)
然后读取文件的内容
```go
func main() {
readFile, err := os.Open("a.txt")
buf := make([]byte, 10)
for {
n, _ := readFile.Read(buf)
fmt.Println(string(buf), "读取子节:", n)
if n == 0 {
break
}
}
}
```
运行结果为:
1
2
3
4
5
读取子节:
10
6
7
3 // 问题在这
4
5
读取子节:
4
6
7
3
4
5
读取子节:0
1234567都读取完后 为什么会从345再读一遍呢 buf中剩余的6个子节不是应该填充默认值么
我理解的是假设读到文件的eof位置时,还会继续读取,但奇怪的是为什么不从12开始呢
刚入坑 有些地方不太理解 还请大神赐教
** 先贴代码 **
```
package main
import (
"fmt"
"os"
"log"
"io"
)
func main() {
rf, err := os.Open("a.txt")
//os.OpenFile("a.txt", os.O_RDWR, 0)
if err != nil {
log.Println("文件读取失败, 原因为: ", err)
os.Exit(1)
}
defer rf.Close()
chunks := make([]byte,10)
buf := make([]byte, 10) // len(buf) = 10, cap(buf) = 10, 初始值为0 byte=unit8 0~255
for {
n, err := rf.Read(buf)
if err != nil && err != io.EOF {
log.Println("读取失败, 原因为: ", err)
os.Exit(1)
}else if err == io.EOF {
break
}
if n == 0 {
break
}
chunks = append(chunks, buf[:n]...)
}
fmt.Println(string(chunks))
}
```
`func make(Type, size IntegerType) Type`这个函数是会指定默认初始值。但是, 你的问题是当slice的长度大于容量时, 此时将动态分配新的数组空间, 指向这个指针地址。 而新开辟的数组空间为当前slice的默认值。
1_2_3_4_5_ 当字节到达指定cap时, 开辟新空间 1_2_3_4_5_ 第二次赋值仅仅将6_7替换掉
#4
更多评论
没有再读一遍,只是上次读完残留的。第一次读五个数12345,下次还是这个buf,但是只读了两个数6和7,把buf里面的1和2给替换掉了,所以会出现67345。
#1
```
func main() {
readFile, err := os.Open("a.txt")
for {
buf := make([]byte, 12)
n, _ := readFile.Read(buf)
if n == 0 {
break
}
fmt.Println(string(buf), "读取子节:", n)
}
}
这样应该是满足你要求的。
```
#2