遇到一段无法理解的代码,求解惑!
go版本 1.22.0
package main
import (
"fmt"
"unsafe"
)
func main() {
var a int64 = 1
var b int64 = 1
fmt.Println(&a, &b)
NilIsNil(a)
var d = make([]int, 10)
var c int64 = 1
NilIsNil2(b)
fmt.Println(a, b, c, d)
var e int64 = 1
// 打开行代码fmt.Println(&a)输出 10 10 10 [0 0 0 0 0 0 0 0 0 0] 10
// 注释fmt.Println(&a)输出 1 1 1 [0 0 0 0 0 0 0 0 0 0] 1
fmt.Println(a, b, c, d, e)
}
func NilIsNil(a any) bool {
// 打开行代码输出 10 10 10 [0 0 0 0 0 0 0 0 0 0] 10
// 注释输出 1 1 1 [0 0 0 0 0 0 0 0 0 0] 1
fmt.Println(&a)
type rtype struct {
t unsafe.Pointer
data unsafe.Pointer
}
t := (*rtype)(unsafe.Pointer(&a))
*(*int)(t.data) = 10
return a == nil
}
func NilIsNil2(a any) bool {
type rtype struct {
t unsafe.Pointer
data unsafe.Pointer
}
t := (*rtype)(unsafe.Pointer(&a))
fmt.Println("val = ", *(*int)(t.data))
return a == nil
}
在一个群里看见的一段代码,发代码的人说是因为golang缓存了128以下的数字,然后这段代码修改的缓存。但是还是有一些地方不理解。
- 为什么fmt.Println(&a)这个行代码会影响输出结果,这行代码不就是一个打印地址的吗?
- golang真的会缓存128以下的数字吗,内部是如何实现的?
这个结构体有什么含义吗type rtype struct { t unsafe.Pointer data unsafe.Pointer }
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: