Go语言指针不支持算术运算,int、string等常规指针类型完全禁止+、-、++、--及指针相减;编译器主动拦截以防止越界读写、GC失效和跨平台问题;日常开发应使用range、切片表达式、s[i]等安全替代方案;仅极少数场景可谨慎使用unsafe.Pointer。
直接回答:*int、*string 等常规指针类型**完全不支持** +、-、++、-- 或指针相减(如 p - q)。任何尝试都会触发编译错误,例如:invalid operation: p + 1 (mismatched types *int and int)。这不是 bug,是 Go 编译器主动拦截——它连“想试试看”的机会都不给。
允许指针算术,等于把内存地址当整数随意加减,后果很具体:
p + 100 可能落在栈上另一变量或已释放内存里,程序瞬间崩溃或静默损坏数据uintptr 拼出来的“伪指针”混入堆,GC 可能误判对象存活,导致内存泄漏int* 加 1 在 64
95% 的场景,你根本不需要移动指针——Go 提供了更安全、语义更清的替代方案:
for i := range s 或 for _, v := range s,自动带边界检查s[2:5] 比手动算 p + 2 再取 3 个元素直观且安全s[i],编译器生成带溢出检测的机器码*T 传参即可,无需移动指针去“找字段”unsafe.Pointer 是唯一入口,但得自己扛雷仅在极少数场景(如实现序列化库、对接 C 函数、写运行时工具)才可能用到:
import "unsafe"arr := [3]int{10, 20, 30} p := unsafe.Pointer(&arr[0]) nextP := (int)(unsafe.Pointer(uintptr(p) + unsafe.Sizeof(arr[0]))) fmt.Println(nextP) // 输出 20
但这不是“解锁新功能”,而是主动退出安全沙箱。你必须:
int64 必须 8 字节对齐)map 元素、interface{} 底层数据做此类操作日常业务代码里出现 unsafe,应该触发团队 Code Review 警报——它不该是“顺手就写”的选项。