Go类型转换在内部如何工作?
类型转换的内存利用率是多少?例如:
var str1 string
str1 = "26MB string data"
byt := []byte(str1)
str2 := string(byt)
每当我键入转换任何变量时,它将消耗更多的内存吗?
我对此感到担心,因为当我尝试解组时,出现“ 致命错误:运行时:内存不足 ”
err = json.Unmarshal([]byte(str1), &obj)
str1值来自HTTP响应,但是使用ioutils.ReadAll读取,因此它包含完整的响应。
在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
}
问题内容: 我正在阅读有关Java中并发性的Oracle官方文档,但我想知道返回的返回值之间可能有什么区别? 并使用例如 。我假设我用一个。我知道,一般而言,同步集合对于我来说只是一个装饰器,因此很明显a 的内部结构有所不同。您是否有关于这些实施细节的信息? 编辑:我意识到源代码是公开可用的: ConcurrentHashMap.java 问题答案: 我会阅读ConcurrentHashMap的源
在《有效Java》一书中: 后台线程不会在一秒钟后停止。因为提升,在JVM中优化,HotSpot服务器VM做。 您可以在以下主题中查看这一点: 为什么HotSpot会使用提升优化以下内容?。 优化过程如下: 有两种方法可以解决这个问题。 volatile的函数是 -禁止提升 -它保证任何读取该字段的线程都会看到最近写入的值 上面的代码在有效Java书中是正确的,它相当于使用来装饰。 如果此方法忽略
通过查看shmget()的手动页面,我了解到shmget()调用在内存中分配了#个页面,这些页面可以在进程之间共享。 它是否要创建内核内存页,并将其映射到进程的本地地址空间?还是为该段保留了相同的进程内存页,并将为其他附加进程共享相同的内存页? 调用shmget()时,内核将保留一定数量的段/页。 调用shmat()时,保留的段映射到进程的地址空间/页。 当一个新进程附加到同一段时,前面创建的内核
问题内容: 我正在使用Eclipse服务器功能进行热代码部署。使用tomcat作为Web服务器。但是我不确定它是如何工作的。我有自己的理解,它必须如何在内部工作。 我的理解:- 当开发人员更改代码(例如,类Employee)时,Eclipse将在正确的位置(必须是特定的Web /应用服务器,将其称为热部署目录(HDD))放置/发布修改后的已编译类。 。现在将显示Web服务器特定的类加载器。它在HD
是什么使得在类本身内部创建类的实例成为可能? 我知道这是可能的,我自己也做过,但我仍然无法让自己相信这不是“谁是第一个——鸡还是蛋?”问题的类型。我很高兴收到一个答案,它将从编程角度以及JVM/编译器角度阐明这一点。我认为理解这一点将有助于我澄清OO编程中一些非常重要的瓶颈概念。 我收到了一些答案,但没有一个能达到我预期的程度。
问题内容: 该功能在内部如何工作?考虑到内核确实具有访问用户内存空间的特权,它是否使用任何缓冲区还是完成了任何内存映射? 问题答案: 的实现高度依赖于体系结构。 在x86和x86-64上,它只是直接从用户空间地址进行读取并写入内核空间地址,同时如果已配置,则暂时禁用SMAP(超级用户模式访问阻止)。它的棘手部分是将代码放置在特殊区域中,以便页面错误处理程序可以识别其中何时发生错误。发生的内存保护错