跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Go / Golang

Go 语言中 unsafe.Pointer、uintptr 与指针的关系解析

综述由AI生成Golang 中 unsafe.Pointer 是通用指针类型,类似 C++ 的 void*,用于类型转换;uintptr 则是可存储地址的整数,支持加减运算。两者结合可实现内存地址偏移,常用于底层优化或特殊场景。示例展示了如何通过 unsafe 包修改结构体私有字段,需注意内存布局依赖编译器和架构,存在安全风险,生产环境慎用。

魔尊发布于 2022/7/17更新于 2026/6/519 浏览
Go 语言中 unsafe.Pointer、uintptr 与指针的关系解析

核心概念解析

在 Go 的底层机制中,理解这三种类型的区别至关重要:

  • ** 类型*:表示具体的指针类型,例如 *int、*string。它们携带了类型信息,编译器会进行严格的类型检查。
  • unsafe.Pointer:类似于 C++ 中的 void*,是所有指针类型的基类。任何类型的指针都可以转换为 unsafe.Pointer,反之亦然。它主要用于绕过类型系统,实现通用内存操作。
  • uintptr:官方定义为一种整数类型,大小足以容纳任意指针的位模式。简单来说,它是一个可以存储地址值的数字,支持加减运算。

为什么需要 uintptr?

既然有了指针和 unsafe.Pointer,为何还需要 uintptr?关键在于算术运算。前两者都不能直接进行加减计算,而在处理内存偏移(offset)时,必须借助 uintptr 来辅助完成地址的数学运算。

实战演示:通过偏移修改结构体字段

下面这段代码展示了如何利用这三个概念访问并修改结构体的私有字段。虽然结构体字段默认不可外部访问,但通过指针偏移我们可以做到这一点。

package main

import (
	"fmt"
	"unsafe"
)

type Person struct {
	age  int
	name string
}

func main() {
	var zhangsan Person = Person{25, "zhangsan"}

	// 1. 获取结构体首地址,转为具体类型指针修改 age
	// 结构体变量的起始地址即为第一个成员变量的地址
	p := (*int)(unsafe.Pointer(&zhangsan))
	*p = 35

	// 2. 计算 name 字段的偏移量
	// unsafe.Pointer 不能直接加减,需先转成 uintptr 进行计算
	// unsafe.Sizeof(int(0)) 返回该类型占用的字节数
	offset := uintptr(unsafe.Pointer(&zhangsan)) + unsafe.Sizeof(int(0))

	// 3. 将计算后的地址转回 unsafe.Pointer,再转为 *string 指针
	q := (*string)(unsafe.Pointer(offset))
	*q = "lisi"

	fmt.Printf("%v", zhangsan)
}

注意事项

这种操作属于底层'黑科技',虽然能实现特定需求,但存在显著风险:

  1. 内存布局依赖:Go 的内存布局受编译器和架构影响,字段之间可能存在填充(padding),简单的 sizeof 相加不一定准确指向下一个字段。
  2. 安全性:绕过类型检查可能导致程序崩溃或数据损坏,生产环境应尽量避免使用 unsafe 包。
  3. 可维护性:此类代码晦涩难懂,后续维护成本极高。

建议仅在性能优化极端场景或编写底层库时使用,并充分测试兼容性。

目录

  1. 核心概念解析
  2. 为什么需要 uintptr?
  3. 实战演示:通过偏移修改结构体字段
  4. 注意事项
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • OpenClaw 本地部署指南:快速搭建自托管 AI 助手
  • 基于 Python 和 Django 的电影推荐系统设计与实现
  • VSCode 接入智谱 GLM-4 及自定义大模型配置指南
  • Vue3 模板调用方法提示不存在?检查 Script Setup 暴露方式
  • FPGA 内部资源详解:LUT、FF、BRAM、DSP 及 PLL 原理与综合报告解读
  • 通用大模型与行业大模型对比:为何企业更需定制化解决方案
  • VSCode Copilot Chat 加载超时问题排查与解决
  • 预训练语言模型与 BERT 实战应用
  • ShopXO 开源电商系统完整部署指南
  • Redis Hash 类型详解
  • PostgreSQL TIMESTAMPTZ 无法映射 Java LocalDateTime 原因及方案
  • 利用 AI 视觉模型优化 Unity 编辑器插件:从功能实现到界面美化
  • C++ 位运算实战:从基础操作到经典算法题解
  • Web 聊天室消息加解密方案详解
  • 机器视觉与计算机视觉:算法的边界与产业格局解析
  • Spring Boot 教室信息管理系统设计与实现
  • 宇树 G1 人形机器人强化学习训练配置与奖励函数解析
  • 本地化部署 AI 量化分析平台:Docker 配置与波浪理论实战
  • 数据结构实战:链表、栈与队列的 C 语言实现
  • 腾讯 Qclaw 内测:基于微信的 AI 智能体工具使用指南

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online