微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类型转换在内部如何工作?相同的内存利用率是多少?

如何解决类型转换在内部如何工作?相同的内存利用率是多少?

在Go中称为 转换 (不是强制转换),这在“规范:转换”中进行了介绍:

特定规则适用于数字类型之间或字符串类型之间的(非恒定)转换。这些转换可能会更改的表示形式x并产生运行时成本。所有其他转换只会更改类型,而不会更改的表示形式x

因此,通常转换不会复制,而只会更改类型。string由于string值是不可变的,因此通常将/转换为from ,例如,如果将a转换string[]byte不会复制,则可以string通过更改结果字节片的元素来更改a的内容

如果您已经拥有string要解组的JSON内容作为值,则不应[]byte仅出于解组就将其转换为。而是使用strings.NewReader()获取io.Reader从传递的string值读取的,然后将此读取器传递给json.NewDecoder(),这样您就可以取消封送,而不必复制大型输入JSON字符串。

它看起来像这样:

input := "BIG JSON INPUT"
dec := json.NewDecoder(strings.NewReader(input))

var result YourResultType
if err := dec.Decode(&result); err != nil {
    // Handle error
}

还要注意,如果从读取大JSON字符串,则可以进一步优化此解决方io.Reader在这种情况下,您可以完全省略首先读取它,而json.NewDecoder()直接将其传递给,例如:

dec := json.NewDecoder(jsonSource)

var result YourResultType
if err := dec.Decode(&result); err != nil {
    // Handle error
}

解决方法

Go类型转换在内部如何工作?

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

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

每当我键入转换任何变量时,它将消耗更多的内存吗?

我对此感到担心,因为当我尝试解组时,出现“ 致命错误:运行时:内存不足

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。