小编Yaf*_*ang的帖子

在延迟中关闭 gzip 编写器会导致数据丢失

我使用 golanggzip.NewWriter压缩切片?并defer Close()关闭编写器。但是当从压缩数据中读取时,它会返回unexpected EOF. 代码是:

func main() {

    a := []byte{'a', 'b', 'c', 'd', 'e', 'f'}
    zippedData, err := zipData(a)
    if err != nil {
        panic(err)
    }

    unzippedData, err := unzipData(zippedData)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%v\n", unzippedData)

}


Run Code Online (Sandbox Code Playgroud)

zip 函数是:

func zipData(originData []byte) ([]byte, error) {
    var bf bytes.Buffer
    gw := gzip.NewWriter(&bf)

    defer gw.Close()

    _, err := gw.Write(originData)
    if err != nil {
        return nil, errors.New(fmt.Sprintf("gzip data err: %v", err))
    } …
Run Code Online (Sandbox Code Playgroud)

go

2
推荐指数
1
解决办法
323
查看次数

在Golang中将数组设置为nil时,gc会收集对象吗?

我有一个包含许多对象的数组。当我将数组设置为nil时,gc会收集该数组持有的所有对象吗?

package main

import (
    "time"
    "runtime"
)

type B struct {
    bb []int
}

func NewB() *B {
    return new(B)
}

func main()  {
    var bs = make([]*B, 10)
    for i:=0; i<10; i++ {
        bs[i] = NewB()
        bs[i].bb = make([]int, 1000000)
    }

    time.Sleep(time.Second)
    println("begin gc")
    //for i:=0; i<10; i++ {
    //  bs[i] = nil
    //}
    bs = nil
    runtime.GC()
    time.Sleep(time.Second*2)
    runtime.GC()
    time.Sleep(time.Second*2)
}
Run Code Online (Sandbox Code Playgroud)

首先,我设置bs = nil,所有两个gc信息都显示76->76->76 MB,这意味着gc不会释放内存。然后,在斜杠语句中添加for循环代码,第一个gc info显示76->76->0 MB,第二个gc info显示0->0->0 MB。所以我感到困惑的是,当我设置时 …

garbage-collection memory-management heap-memory go

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