你如何在Go中初始化一个空字节。大小为N的缓冲区?

时间:2018-01-19 06:20:14

标签: go

使用bytes.NewBuffer()在Go中创建大小为n的空缓冲区的最简单方法是什么?

2 个答案:

答案 0 :(得分:2)

在此处添加一些其他信息。在doc字符串的末尾简要提到了创建新缓冲区的快捷方法:

b := new(bytes.Buffer)

b := &bytes.Buffer{}

Buffer struct define包含一个64字节的内部bootstrap字段,最初用于小分配。超过默认大小后,将创建一个字节片Buffer.buf并进行内部维护。

正如@leafbebop建议我们可以使用新切片预先初始化buf结构的Buffer字段。

b := bytes.NewBuffer(make([]byte,0,N))

我还找到了使用Grow()方法的另一种选择:

b := new(bytes.Buffer)
b.Grow(n)

同样有趣的是,内部buf切片将以cap(buf)*2 + n的速度增长。这意味着如果您已将1MB写入缓冲区然后添加1个字节,则cap()将增加到2097153个字节。

答案 1 :(得分:-1)

// Set up a buffer to temporarily hold the encoded data.

var buf bytes.Buffer

// Write JSON-encoded data to a buffer of bytes.
// This buffer will grow to whatever size necessary to
// hold the buffered data.

err := json.NewEncoder(&buf).Encode(&v)

// Send the HTTP request. Whatever is read from the Reader
// will be sent in the request body.
// The buffer is also a Reader, so it can be passed in here.
// Its data will be read out until the buffer is complete.

resp, err := http.Post(“example.com”, “application/json”, &buf)