【发布时间】:2015-10-29 02:48:28
【问题描述】:
我想将地图限制为最大 X 字节。不过,似乎没有直接的方法来计算地图的字节长度。
"encoding/binary" 包有一个不错的Size function,但它只适用于切片或“固定值”,不适用于地图。
我可以尝试从映射中获取所有键/值对,推断它们的类型(如果它是 map[string]interface{})并计算长度 - 但这既麻烦又可能不正确(因为这会排除“内部" 地图本身的成本 - 管理指向元素的指针等)。
有什么建议的方法吗?最好是代码示例。
【问题讨论】:
-
你不能以可靠的方式做你想做的事:例如。 “内部 golang 成本”取决于您机器的字长。我虽然认为“地图使用 X 字节”的概念是有缺陷的;考虑一个包含切片的地图:您是否将支持数组的字节数计入地图?我建议搜索一个不同的解决方案,特别是因为使用
interface{}有难闻的气味。 -
感谢您的评论。用例实际上相当简单:我想对缓存施加大小限制(而不是时间限制)。如果我想使用映射(可以说是在 Go 中用作缓存对象的最合适的原语)(甚至假设它不是字符串/接口的映射)我在语言中的选择是什么(使用外部这个工具似乎有点矫枉过正)?
-
限制缓存中的数据量是一个有效的用例,但这只有在缓存中存储大量可变大小的数据时才有意义,这意味着地图本身的开销将是微不足道。如果你有固定大小的数据,你可以通过地图的 len 来限制。
标签: dictionary go