如何初始化字节片以便向操作系统写入4096字节.文件



我正在尝试向操作系统写入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文档:

切片:大小指定长度。切片的容量为等于其长度。第二个整数参数可以提供给指定不同的容量;[…]

然后bufWriteByteWrite附加到它。

写入将p的内容附加到缓冲区

所以您最终得到的切片的总长度为:

4095(来自make(+1(来自buf.WriteByte(byte(10))+4095(来自buf.Write(pu)(=8191。


改为使用make([]byte, 0, 4096-1)初始化bytesToBuffer。你可以在这个围棋游戏中看到它。

最新更新