You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go中getSlice()[:]报错slice of unaddressable value的原因是什么?

解析Go中“slice of unaddressable value”报错的原因

这个问题的核心在于Go语言对可寻址值的规则,以及数组切片和字符串切片的本质差异,我一步步给你讲明白:

1. 先明确两个函数的返回类型差异

  • getSlice()返回的是固定长度为0的数组类型[0]int,注意这不是切片,是实打实的数组!
  • getString()返回的是字符串类型string

2. 为什么getSlice()[:]会报错?

数组的切片操作(比如a[:])本质是创建一个新切片,这个切片的底层会持有原数组的指针——这就要求原数组必须是可寻址的,因为只有可寻址的值才能获取它的内存地址,切片才能指向它。

但getSlice()直接返回的是一个临时数组值,Go语言有明确规定:函数返回的非指针、非引用类型的临时值是不可寻址的(你可以试试&getSlice(),同样会报错)。既然连地址都拿不到,自然没法创建指向它的切片,编译器就抛出了“slice of unaddressable value”的错误。

3. 为什么getString()[:]却能正常运行?

字符串的切片操作和数组切片完全是两回事!字符串是不可变类型,s[:]这种语法返回的是原字符串的子串,它并不需要原字符串可寻址——因为字符串的子串只是共享原字符串的底层字节数组,但Go语言对字符串的切片做了特殊支持,哪怕是临时的字符串值(比如函数直接返回的字符串),也可以直接进行切片操作。

4. 为什么赋值后就没问题了?

当你把getSlice()的返回值赋值给变量a后,a是一个栈上的变量,属于可寻址值(你可以对它取地址&a)。此时a[:]就可以正常创建切片,因为能拿到数组的内存地址了。同理,变量b是可寻址的字符串变量,切片操作自然也没问题。

最后总结一下:

  • 数组切片要求原数组可寻址,临时数组值不可寻址,所以直接切片报错;
  • 字符串切片不要求原字符串可寻址,临时字符串值可以直接切片;
  • 变量都是可寻址的,所以赋值后切片正常。

内容的提问来源于stack exchange,提问作者edupo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:03:00