相关疑难解决方法(0)

你如何清除Go中的切片?

在Go中清除切片的适当方法是什么?

以下是我在go论坛中发现的内容:

// test.go
package main

import (
    "fmt"
)

func main() {
    letters := []string{"a", "b", "c", "d"}
    fmt.Println(cap(letters))
    fmt.Println(len(letters))
    // clear the slice
    letters = letters[:0]
    fmt.Println(cap(letters))
    fmt.Println(len(letters))
}
Run Code Online (Sandbox Code Playgroud)

它是否正确?

为了澄清,缓冲区被清除,因此可以重复使用.

一个例子是bytes包中的Buffer.Truncate函数.

请注意,Reset只调用Truncate(0).所以看来在这种情况下,第70行会评估:b.buf = b.buf [0:0]

http://golang.org/src/pkg/bytes/buffer.go

// Truncate discards all but the first n unread bytes from the buffer.
60  // It panics if n is negative or greater than the length of the buffer.
61  func (b *Buffer) Truncate(n int) {
62 …
Run Code Online (Sandbox Code Playgroud)

arrays go slice

116
推荐指数
4
解决办法
9万
查看次数

一旦被bytes.Buffer占用就无法释放内存

我收到compressedbytes类型为[] byte 的压缩ASCII文本字节.我面临的问题是,以下过程占用了大量内存,这些内存在函数到达其结束后未被释放,并且在程序的整个运行时期间仍然被占用.

    b := bytes.NewReader(compressedbytes)
    r, err := zlib.NewReader(b)
    if err != nil {
        panic(err)
    }
    cleartext, err = ioutil.ReadAll(r)
    if err != nil {
        panic(err)
    }
Run Code Online (Sandbox Code Playgroud)

我注意到使用的类型是bytes.Buffer,这种类型具有Reset()Truncate()函数,但它们都不允许释放曾经占用的内存.

文档Reset()状态如下:

重置将缓冲区重置为空,但它会保留底层存储以供将来的写入使用.重置与截断(0)相同.

如何取消缓冲区并再次释放内存?我的程序在运行期间需要大约50MB的内存,需要2小时.当我导入zlib压缩的字符串时,程序需要200 MB的内存.

谢谢你的帮助.

===更新

我甚至为解压缩创建了一个单独的函数,并runtime.GC()在程序从该函数返回后手动调用垃圾收集器,但没有成功.

// unpack decompresses zlib compressed bytes
func unpack(packedData []byte) []byte {
    b := bytes.NewReader(packedData)
    r, err := zlib.NewReader(b)
    if err != nil {
        panic(err)
    }
    cleartext, err := ioutil.ReadAll(r)
    if …
Run Code Online (Sandbox Code Playgroud)

memory buffer zlib go

4
推荐指数
1
解决办法
8848
查看次数

标签 统计

go ×2

arrays ×1

buffer ×1

memory ×1

slice ×1

zlib ×1