在Java中,正如我们所知,二维数组是多维一维数组.这意味着那些一维数组在内存上不连续.
相反,在C中,二维数组实际上是一维数组,其大小为total_row*total_column.因为Go语言使用了C语言中的许多概念.所以我的问题是:Go中的二维数组的内存表示看起来像是C还是Java?
我想将地图限制为最大X字节.似乎没有直接计算地图字节长度的方法.
"encoding/binary"package有一个很好的Size功能,但它只适用于切片或"固定值",而不适用于map.
我可以尝试从地图中获取所有键/值对,推断它们的类型(如果它是a map[string]interface{})并计算长度 - 但这既麻烦又可能不正确(因为这将排除地图的"内部"golang成本本身 - 管理元素指针等.
这样做的任何建议方式?最好是代码示例.
给定未指定初始空间的映射分配,例如:
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) 在下面的代码中:
c := "fool"
d := []byte("fool")
fmt.Printf("c: %T, %d\n", c, unsafe.Sizeof(c)) // 16 bytes
fmt.Printf("d: %T, %d\n", d, unsafe.Sizeof(d)) // 24 bytes
Run Code Online (Sandbox Code Playgroud)
要确定从CloudFoundry接收JSON数据所需的数据类型,请测试上面的示例代码以了解[]bytevs string类型的内存分配。
string类型变量的预期大小c为1个字节x 4个ascii编码字母= 4个字节,但是大小显示为16个字节。
对于byte类型变量d,GO将字符串作为字符串文字嵌入到可执行程序中。它将在运行时使用该runtime.stringtoslicebyte函数将字符串文字转换为字节片。就像是...[]byte{102, 111, 111, 108}
byte类型变量的预期大小d再次为1字节x 4 ascii值= 4字节,但是变量的大小d显示为24字节,因为它是基础数组容量。
为什么两个变量的大小都不是4个字节?
我想知道 uint8 或 uint16 Go 映射键是否将存储为 1/2 字节,或者它们将具有 uint32/64 内存分配,而不管指定较小的值?
我正在阅读“A Tour of Go”教程,并对其中一个示例进行了一些修改,发现 Go 中 bool 的大小是 16 个字节?!我是否没有使用正确的函数来计算这个值,或者 bool 的大小确实是 16 个字节?
package main
import "fmt"
import "unsafe"
func do(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("Twice %v is %v\n", v, v*2)
case string:
fmt.Printf("%q is %v bytes long\n", v, len(v))
default:
fmt.Printf("I don't know about type %T, but it's length is: %v bytes!\n", v, unsafe.Sizeof(v))
}
}
func main() {
do(21)
do("hello")
do(false)
}
Run Code Online (Sandbox Code Playgroud)
输出:
Twice 21 is 42
"hello" is 5 bytes long …Run Code Online (Sandbox Code Playgroud)