如何在golang中以字节为单位获取struct及其内容的大小?

7 memory go

我有一个结构,说:

type ASDF struct {
    A   uint64
    B   uint64
    C   uint64
    D   uint64
    E   uint64
    F   string
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个结构的片段: a := []ASDF{}

我对结构的那一部分进行操作(添加/删除/更新内容不同的结构); 如何获得切片及其内容的总大小(以字节单位)?是否有内置功能,或者我是否需要手动运行计算unsafe.Sizeof然后使用len每个字符串?

pet*_*rSO 6

求和所有内存的大小,不包括垃圾收集器和其他开销.例如,

package main

import (
    "fmt"
    "unsafe"
)

type ASDF struct {
    A uint64
    B uint64
    C uint64
    D uint64
    E uint64
    F string
}

func (s *ASDF) size() int {
    size := int(unsafe.Sizeof(*s))
    size += len(s.F)
    return size
}

func sizeASDF(s []ASDF) int {
    size := 0
    s = s[:cap(s)]
    size += cap(s) * int(unsafe.Sizeof(s))
    for i := range s {
        size += (&s[i]).size()
    }
    return size
}

func main() {
    a := []ASDF{}

    b := ASDF{}
    b.A = 1
    b.B = 2
    b.C = 3
    b.D = 4
    b.E = 5
    b.F = "ASrtertetetetetetetDF"
    fmt.Println((&b).size())
    a = append(a, b)

    c := ASDF{}
    c.A = 10
    c.B = 20
    c.C = 30
    c.D = 40
    c.E = 50
    c.F = "ASetDF"
    fmt.Println((&c).size())
    a = append(a, c)

    fmt.Println(len(a))
    fmt.Println(cap(a))
    fmt.Println(sizeASDF(a))
}
Run Code Online (Sandbox Code Playgroud)

输出:

69
54
2
2
147
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/5z30vkyuNM