golang类型内部如何工作?同样的内存利用率是多少?

时间:2017-07-20 07:19:04

标签: string go type-conversion slice

golang类型内部如何工作?

类型转换的内存利用率是多少? 例如:

var str1 string
str1 = "26MB string data"
byt := []byte(str1)
str2 := string(byt)

每当我输入任何变量时,它会占用更多内存吗?

我担心这个问题,因为当我尝试解组时,我得到了" 致命错误:运行时:内存不足"

err = json.Unmarshal([]byte(str1), &obj)

str1值来自HTTP响应,但是使用ioutils.ReadAll读取,因此它包含完整的响应。

1 个答案:

答案 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
}