为了账号安全,请及时绑定邮箱和手机立即绑定

分配未初始化的切片

分配未初始化的切片

Go
大话西游666 2021-06-18 18:38:18
有没有办法在 Go 中分配一个未初始化的切片?一个常见的模式是创建一个给定大小的切片作为缓冲区,然后只使用它的一部分来接收数据。例如:b := make([]byte, 0x20000) // b is zero initializedn, err := conn.Read(b)// do stuff with b[:n]. all of b is zeroed for no reason当分配大量缓冲区时,此初始化可以累加,因为规范规定它将在分配时默认初始化数组。
查看完整描述

2 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

您可以从bufs.Cache.Get获取非零字节缓冲区(或查看并发安全版本)。从文档CCache

注意:Get 返回的缓冲区不保证为零。例如,将缓冲区传递给 io.Reader 是可以的。如果您需要清零缓冲区,请使用 Cget。


查看完整回答
反对 回复 2021-06-21
?
慕容森

TA贡献1853条经验 获得超18个赞

从技术上讲,您可以通过在 go 运行时之外分配内存并使用unsafe.Pointer,但这绝对是错误的做法。


更好的解决方案是减少分配次数。将缓冲区移到循环外,或者,如果您需要每个 goroutine 缓冲区,请在池中分配几个缓冲区,并仅在需要时分配更多缓冲区。


type BufferPool struct {

    Capacity int

    buffersize int

    buffers []byte

    lock sync.Mutex

}


func NewBufferPool(buffersize int, cap int) {

    ret := new(BufferPool)

    ret.Capacity = cap

    ret.buffersize = buffersize

    return ret

}


func (b *BufferPool) Alloc() []byte {

    b.lock.Lock()

    defer b.lock.Unlock()

    if len(b.buffers) == 0 {

        return make([]byte, b.buffersize)

    } else {

        ret := b.buffers[len(b.buffers) - 1]

        b.buffers = b.buffers[0:len(b.buffers) - 1]

        return ret

    }

}


func (b *BufferPool) Free(buf []byte) {

    if len(buf) != b.buffersize {

        panic("illegal free")

    }

    b.lock.Lock()

    defer b.lock.Unlock()

    if len(b.buffers) < b.Capacity {

        b.buffers = append(b.buffers, buf)

    }

}


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信