亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

分配未初始化的切片

分配未初始化的切片

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 關注
  • 228 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號