Har*_*rdy 4 string type-conversion go slice
Go类型转换在内部如何工作?
类型转换的内存利用率是多少?例如:
var str1 string
str1 = "26MB string data"
byt := []byte(str1)
str2 := string(byt)
Run Code Online (Sandbox Code Playgroud)
每当我键入转换任何变量时,它将消耗更多的内存吗?
我对此很担心,因为当我尝试解组时,会出现“ 致命错误:运行时:内存不足 ”
err = json.Unmarshal([]byte(str1), &obj)
Run Code Online (Sandbox Code Playgroud)
str1值来自HTTP响应,但使用ioutils.ReadAll读取,因此它包含完整的响应。
在Go中称为转换(不是强制转换),这在“ 规范:转换”中进行了介绍:
特定规则适用于数字类型之间或字符串类型之间的(非恒定)转换。这些转换可能会更改的表示形式
x并产生运行时成本。所有其他转换只会更改类型,而不会更改的表示形式x。
因此,通常转换不会复制,只会更改类型。string由于string值是不可变的,因此通常将/转换为from ,例如,如果将a转换string为[]byte不能复制,则可以string通过更改结果字节片的元素来更改a的内容。
请参阅相关问题:Go中别名类型之间的转换是否会创建副本?
从/转换为/ string不能复制时有一些例外(编译器优化),有关详细信息,请参见golang:[] byte(string)vs [] byte(* string)。
如果您已经将JSON内容作为string要取消编组的值,则不应[]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
}
Run Code Online (Sandbox Code Playgroud)
还要注意,如果从读取大的JSON字符串,则可以进一步优化此解决方案io.Reader,在这种情况下,您可以完全省略首先读取它,而json.NewDecoder()直接将其传递给,例如:
dec := json.NewDecoder(jsonSource)
var result YourResultType
if err := dec.Decode(&result); err != nil {
// Handle error
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
634 次 |
| 最近记录: |