我正在尝试向操作系统写入4096个字节。文件,但它写入所有容量-你能帮我理解为什么切片lenbytes
的长度超过4096吗?
// ...
tempStdin, err := ioutil.TempFile(".", "stdin.txt")
bytesToBuffer := make([]byte, 4096-1)
buf := bytes.NewBuffer(bytesToBuffer)
buf.WriteByte(byte(10))
pad(1, buf)
lenbytes := buf.Bytes() // len(lenbytes) is 8191
if _, err := tempStdin.Write(lenbytes); err != nil {
panic(err)
}
}
func pad(siz int, buf *bytes.Buffer) {
pu := make([]byte, 4096-siz)
for i := 0; i < 4096-siz; i++ {
pu[i] = 97
}
buf.Write(pu)
}
因为此表达式bytesToBuffer := make([]byte, 4096-1)
正在初始化bytesToBuffer
,长度和容量都设置为4095
。
来自内置make
文档:
切片:大小指定长度。切片的容量为等于其长度。第二个整数参数可以提供给指定不同的容量;[…]
然后buf
的WriteByte
和Write
都将附加到它。
写入将p的内容附加到缓冲区
所以您最终得到的切片的总长度为:
4095(来自make
(+1(来自buf.WriteByte(byte(10))
+4095(来自buf.Write(pu)
(=8191。
改为使用make([]byte, 0, 4096-1)
初始化bytesToBuffer
。你可以在这个围棋游戏中看到它。