0

0

Go语言指针可以参与运算吗_Golang指针使用限制说明

P粉602998670

P粉602998670

发布时间:2026-01-26 16:24:10

|

132人浏览过

|

来源于php中文网

原创

Go语言指针不支持算术运算,int、string等常规指针类型完全禁止+、-、++、--及指针相减;编译器主动拦截以防止越界读写、GC失效和跨平台问题;日常开发应使用range、切片表达式、s[i]等安全替代方案;仅极少数场景可谨慎使用unsafe.Pointer。

go语言指针可以参与运算吗_golang指针使用限制说明

Go语言指针不能做算术运算

直接回答:*int*string 等常规指针类型**完全不支持** +-++-- 或指针相减(如 p - q)。任何尝试都会触发编译错误,例如:invalid operation: p + 1 (mismatched types *int and int)。这不是 bug,是 Go 编译器主动拦截——它连“想试试看”的机会都不给。

为什么禁止?不是为了难为你,而是拦住真实风险

允许指针算术,等于把内存地址当整数随意加减,后果很具体:

  • 越界读写:p + 100 可能落在上另一变量或已释放内存里,程序瞬间崩溃或静默损坏数据
  • GC 失效:Go 的垃圾回收器依赖精确识别哪些值是指针。如果靠 uintptr 拼出来的“伪指针”混入堆,GC 可能误判对象存活,导致内存泄漏
  • 跨平台翻车:int* 加 1 在 64 位系统跳 8 字节,32 位跳 4 字节;但 Go 要求代码一次编写、到处运行,这种隐式依赖被直接砍掉

日常开发该用什么代替指针运算

95% 的场景,你根本不需要移动指针——Go 提供了更安全、语义更清的替代方案:

  • 遍历数组/切片?用 for i := range sfor _, v := range s,自动带边界检查
  • 取子序列?用切片表达式:s[2:5] 比手动算 p + 2 再取 3 个元素直观且安全
  • 访问某索引元素?直接 s[i],编译器生成带溢出检测的机器码
  • 需要传大结构体避免拷贝?用 *T 传参即可,无需移动指针去“找字段”

真要底层偏移?unsafe.Pointer 是唯一入口,但得自己扛雷

仅在极少数场景(如实现序列化库、对接 C 函数、写运行时工具)才可能用到:

Baklib
Baklib

在线创建产品手册、知识库、帮助文档

下载

立即学习go语言免费学习笔记(深入)”;

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 字节对齐)
  • 确认目标内存未逃逸、未被 GC 回收(比如不能对局部变量地址做偏移后长期持有)
  • 避免对 map 元素、interface{} 底层数据做此类操作
  • 每次使用都加注释说明必要性,并通过单元测试覆盖边界情况

日常业务代码里出现 unsafe,应该触发团队 Code Review 警报——它不该是“顺手就写”的选项。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

401

2023.08.02

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

220

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

190

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

401

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

543

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

73

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

8

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号