如何正确对指针指向的切片进行切片操作
技术百科
霞舞
发布时间:2026-01-24
浏览: 次 在 go 中,对指向切片的指针执行切片操作时,因运算符优先级问题(切片表达式 `[]` 优先级高于解引用 `*`),需显式加括号 `(*sliceptr)` 才能先解引用再切片,否则会编译失败。
Go 的切片表达式(如 [0:len(s)-1])具有比一元解引用操作符 * 更高的运算符优先级。这意味着当你写 *slicePtr[0 : len(*slicePtr)-1] 时,编译器实际将其解析为 *(slicePtr[0 : len(*slicePtr)-1]) —— 即尝试对指针 slicePtr 本身做切片(这显然非法,因为 slicePtr 是 *[]int 类型,不是切片),从而触发错误:
cannot slice slicePtr (type *[]int)
而原始写法中:
func PtrSubtractOneFromLength(slicePtr *[]byte) {
slice := *slicePtr // 显式解引用,得到 []byte 值
*slicePtr = slice[0 : len(slice)-1] // 对值切片,再赋回指针
}之所以可行,是因为 slice := *slicePtr 将指针解引用为一个独立的切片值(包含底层数组、长度、容量三要素的头部副本),后续切片操作作用于该值,逻辑清晰且符合语法。
✅ 正确的内联写法(无需中间变量)是添加括号强制优先级:
func PtrSubtractOneFromLength(slicePtr *[]int) { *slicePtr = (*slicePtr)[0 : len(*slicePtr)-1] }
这里 (*slicePtr) 先完成解引用,得到 []int 类型,之后 [0 : len(...)-1] 才能合法作用于该切片。
⚠️ 注意事项:
- 切片本身是值类型,*slicePtr 解引用后得到的是原切片头的副本,但其 Data 字段仍指向同一底层数组,因此修改长度/容量会影响原切片视图;
- 若切片长度已为 0,len(*slicePtr)-1 将导致运行时 panic(索引越界),建议增加边界检查;
- 此类操作虽可行,但易出错;更推荐通过返回新切片 + 赋值的方式提升可读性与安全性,例如:
func SubtractOneFromLength(s []int) []int { if len(s) == 0 { return s } return s[:len(s)-1] } // 使用:s = SubtractOneFromLength(s)
总之,理解 Go 运算符优先级是避免此类错误的关键——当涉及指针与切片组合操作时,始终用括号明确解引用时机。
# 的是
# 将其
# 更高
# 是因为
# 此类
# 则会
# 作用于
# go
# int
# 值类型
# 指针
# 切片
# len
# 运算符
# 但其
# 已为
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- PythonPandas数据分析项目教程_时间序列
- C++ STL算法库怎么用?C++常用算法函数(s
- Win11输入法选字框不见了怎么办_Win11输入
- 如何在 Go 中调用动态链接库(.so)中的函数
- Win11怎么设置默认邮件应用_Windows11
- Win11用户账户控制怎么关_Win11关闭UAC
- Python函数缓存机制_lru_cache解析【
- 如何使用Golang reflect检查方法数量_
- Python爬虫项目实战教程_Scrapy抓取与存
- Win11怎么关闭边缘滑动手势_Windows11
- 如何在 Go 中正确反序列化多个同级 XML 元素
- LINUX如何查看文件类型_Linux中file命
- Win11此电脑不在桌面上_Windows 11桌
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- 短链接怎么用php递归还原_多层加密链接的处理法【
- c++中explicit(bool)的用法 c++
- LINUX如何删除用户和用户组_Linux use
- Windows10系统怎么查看CPU核心数_Win
- Win11如何设置开机自动联网 Win11宽带连接
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Win11文件扩展名怎么显示 Win11查看文件后
- SAX解析器是什么,它与DOM在处理大型XML文件
- Ajax提交表单PHP怎么接收_处理Ajax发送的
- Win10如何更改网络连接_Windows10以太
- 如何使用Golang指针与接口结合_实现方法调用和
- c++ stringstream用法详解_c++字
- Win11怎么设置环境变量_Win11配置Path
- Win10怎么设置开机密码_Windows10账户
- 如何使用Golang构建基础消息队列模拟_Gola
- c++如何打印函数堆栈信息_c++ backtra
- php中$this和::能混用吗_对象与静态作用域
- Win11怎么开启剪贴板历史记录_Windows1
- 如何在 IIS 上为 ASP.NET 6 应用排除
- Win10如何优化内存使用_Win10内存优化技巧
- Win11怎么打开旧版计算器_Win11恢复传统计
- 如何在Golang中处理URL参数_Golang
- Win11资源管理器卡顿怎么办 Win11文件资源
- Go 中 := 短变量声明的类型推导机制详解
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- Windows10怎么用“讲述人”读屏辅助 Win
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- Python函数接口文档化_自动化说明【指导】
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- 如何在 Go 中高效缓存与分发网络视频流
- Win11如何设置系统语言_Win11系统语言切换
- 如何使用Golang管理跨项目依赖_Golang多
- Windows 10怎么录屏_Windows 10
- 如何用正则与预处理结合精准拦截拼接式垃圾域名
- c++如何利用doxygen生成开发文档_c++
- Mac怎么查看活动监视器_理解Mac进程和资源占用


QQ客服