给定未指定初始空间的映射分配,例如:
foo := make(map[string]int)
Run Code Online (Sandbox Code Playgroud)
该文件表明,这里的内存分配是依赖于实现.那么(怎么样)我可以告诉我的实现分配给这张地图的内存量是多少?
我正在使用map [string] string优化代码,其中map的值仅为“ A”或“ B”。因此,我认为显然,map [string] bool更好,因为该地图可容纳约5000万个元素。
var a = "a"
var a2 = "Why This ultra long string take the same amount of space in memory as 'a'"
var b = true
var c map[string]string
var d map[string]bool
c["t"] = "A"
d["t"] = true
fmt.Printf("a: %T, %d\n", a, unsafe.Sizeof(a))
fmt.Printf("a2: %T, %d\n", a2, unsafe.Sizeof(a2))
fmt.Printf("b: %T, %d\n", b, unsafe.Sizeof(b))
fmt.Printf("c: %T, %d\n", c, unsafe.Sizeof(c))
fmt.Printf("d: %T, %d\n", d, unsafe.Sizeof(d))
fmt.Printf("c: %T, %d\n", c, …Run Code Online (Sandbox Code Playgroud) 我发现切片图功能和通道经常一起作为参考类型提及。但是我注意到,切片的东西不会表现出任何参考行为,因为它们可能会过时:
var s []int
//must update slice value
s = append(s, ...)
Run Code Online (Sandbox Code Playgroud)
要么
//must use pointer if we want to expose the change
func foo(s *[]int) error
//or change the function signature to return it like _append_
func foo(s []int) (r slice, err error)
Run Code Online (Sandbox Code Playgroud)
通常,我通过牢记切片描述符实现的内部组件来理解这一点:切片值可以视为len,cap和data指针的结构。
但是地图值永远不需要像
m := make(map[string]int)
...
// don't know how to express with insertion, but you know what i mean.
m = delete(m, "well")
Run Code Online (Sandbox Code Playgroud)
为什么?映射值仅仅是指向映射描述符的指针吗?如果是这样,为什么还不这样做呢?
go ×3
dictionary ×2
heap-memory ×1
memory ×1
pointers ×1
reference ×1
size ×1
slice ×1
string ×1