go unsafe的用处
2023-04-18 16:14:06 时间
解释不为安排指针:
unsafe.Pointer其实就是类似C的void *,在golang中是用于各种指针相互转换的桥梁。uintptr是golang的内置类型,是能存储指针的整型,uintptr的底层类型是int,它和unsafe.Pointer可相互转换。
正常的情况来说go语言的中的结构私有变量不能直接被访问或者直接被修改,但是可以通过unsafe的操作来直接对么有变量进入取值或者修改
package main
import (
_ "ORMTest/routers"
"fmt"
"unsafe"
)
func main() {
d := struct {
s string
i int
}{"abc", 100}
p := uintptr(unsafe.Pointer(&d)) // *struct -> Pointer -> uintptr
p += unsafe.Offsetof(d.s) // uintptr + offset
p2 := unsafe.Pointer(p) // uintptr -> Pointer
px := (*int)(p2) // Pointer -> *int
*px = 200 // d.s = 200
fmt.Printf("%#v
", d)
}
输出:
{s string;x int}{s:"abc",x:200}
相关文章
- Nginx 限流的天坑!!
- 09-MinIO对象存储服务概述和入门
- FeignClient设置超时时间(包括方法级别)
- idea永久激活教程(新版)
- 多线程下的数据安全
- json的String串如何做修改?
- 用1000行代码统计西安新房价格后,我有一个惊人的发现……
- Sentinel vs Hystrix 限流对比,到底怎么选?
- 关于Git的使用
- AJAX学习(1)
- 04-HTTP&Tomcat&Servlet入门
- 终止线程的运行
- 获取线程对象的名称
- SMBMS(超市订单管理系统)项目从零开始搭建
- 设计模式之单例和原型
- 一文参透分布式存储系统Ceph的架构设计、集群搭建(手把手)
- Dubbo源码(五) - 服务目录
- 多线程顺序运行的 4 种方法,面试随便问!
- Windows高效开发环境配置(一)
- JavaWeb-MVC、过滤器