golang类型内部如何工作?
类型转换的内存利用率是多少? 例如:
var str1 string
str1 = "26MB string data"
byt := []byte(str1)
str2 := string(byt)
每当我输入任何变量时,它会占用更多内存吗?
我担心这个问题,因为当我尝试解组时,我得到了" 致命错误:运行时:内存不足"
err = json.Unmarshal([]byte(str1), &obj)
str1值来自HTTP响应,但是使用ioutils.ReadAll读取,因此它包含完整的响应。
答案 0 :(得分:4)
它在Go(非转换)中称为转换,这在[{3}}
中有所介绍特定规则适用于数字类型之间的(非常量)转换或字符串类型之间的转换。这些转化可能会更改
x
的表示形式并产生运行时费用。所有其他转化仅更改类型,但不更改x
的表示。
所以一般来说转换不会复制,只会更改类型。转换为/ string
通常会,因为string
值是不可变的,例如,如果将string
转换为[]byte
不会复制,则可以更改内容通过更改结果字节切片的元素来改变string
。
请参阅相关问题:Spec: Conversions:
转换为/ string
时,有一些例外(编译器优化)不会复制,有关详细信息,请参阅Does convertion between alias types in Go create copies?。
如果您已将JSON内容作为要解组的string
值,则不应仅为了解组而将其转换为[]byte
。而是使用golang: []byte(string) vs []byte(*string)获取从string
值中读取的strings.NewReader()
,并将此读者传递给io.Reader
,这样您就可以解组而无需复制大输入JSON字符串。
这就是它的样子:
input := "BIG JSON INPUT"
dec := json.NewDecoder(strings.NewReader(input))
var result YourResultType
if err := dec.Decode(&result); err != nil {
// Handle error
}
另请注意,如果从io.Reader
读取大JSON字符串,则可以进一步优化此解决方案,在这种情况下,您可以完全省略首先读取它,只需将其直接传递给json.NewDecoder()
,例如:
dec := json.NewDecoder(jsonSource)
var result YourResultType
if err := dec.Decode(&result); err != nil {
// Handle error
}