Go 1.15 中,小整数转换为接口值的疑问

quanquan616 · · 839 次点击
确实是好文章,感谢大佬分享。其实 2 楼的大佬,通过 C 语言的方式,已经提醒我了。 我个人的理解:直接获取切片中的元素地址,它其实是在访问这个切片,而不是在访问那个特殊的静态小整数数组。 `func dummy(b int) interface{}` 函数将一个 `int` 类型转换为借口类型,如果这个数值是 `[0 ~ 255]` 那么刚好就符合了站长文章中提及的:小整数转换为接口类型时,将不再需要额外的内存分配了。个人想想:因为这个小整数变成接口类型时,就存在于一个特殊的静态数组中。 我个人感觉,这个功能咋有点鸡肋 :sweat_smile: 。只有当小整数转换为接口类型时,才不会有额外的内存分配。直接初始化小整数时,还是会有内存分配。整数转换为接口类型,也是要消耗资源(虽然这个消耗很小很小)。直接让小整数不转换接口类型就能指向这个特殊的静态数组,它不香吗?没能理解官方为什么要这么设置。
#5
更多评论
你这里打印的是 slice 中元素的地址,都是连续的,看着没什么问题。至于`interface{}`,我就不清楚怎么查了,怀疑取值时go内部会转换掉,你很难拿到。要不一起看看 https://research.swtch.com/interfaces 研究下。
#1
我觉得吧, make只是分配一个interface{}的数组, 但是数组的值都是nil, 这个应该理解成void*, 这个地址有3个很正常, 指针本身也有地址的.你后来的赋值, 把小整数赋值过去, 不分配内存的意思我相信应该是这个小整数已经作为常量池的数据 固定在内存某个地方, 你的interface是直接指向这里的, 而不用另外新分配的动态变量地址.
#2