String 对函数的返回片寻址时出错
在下一个代码中,第一个String 对函数的返回片寻址时出错,string,go,call,slice,String,Go,Call,Slice,在下一个代码中,第一个Println在生成时失败,错误为无法寻址的值片。其余的线路都很好 package main import "fmt" func getSlice() [0]int { return [...]int{} } func getString() string { return "hola" } func main() { fmt.Println(getSlice()[:]) // Error: slice of unaddressable valu
Println
在生成时失败,错误为无法寻址的值片。其余的线路都很好
package main
import "fmt"
func getSlice() [0]int {
return [...]int{}
}
func getString() string {
return "hola"
}
func main() {
fmt.Println(getSlice()[:]) // Error: slice of unaddressable value
var a = getSlice()
fmt.Println(a[:])
fmt.Println(getString()[:])
var b = getString()
fmt.Println(b[:])
}
如果对第一个Println
进行了注释,则它可以工作。
为什么呢?这里我缺少的是什么?您缺少的是,在切片数组时,操作数必须是可寻址的([0]int
是数组,而不是切片)。函数调用的返回值不可寻址。详情见:;和
如果切片操作数是数组,则它必须是数组,并且切片操作的结果是与数组具有相同元素类型的切片
在此表达式中:
getSlice()[:]
getString()[:]
getSlice()
返回一个数组,由于它是函数调用的结果,因此不可寻址。因此,您无法对其进行切片
在此表达式中:
getSlice()[:]
getString()[:]
getString()
返回一个string
值,因此即使该值不可寻址,也可以对其进行切片。这是允许的,因为切片表达式的结果将是另一个string
,并且Go中的string
值是不可变的
此外,变量是可变的,因此这将始终有效:
var a = getSlice()
fmt.Println(a[:])
您缺少的是在切片数组时,操作数必须是可寻址的([0]int
是数组,而不是切片)。函数调用的返回值不可寻址。详情见:;和
如果切片操作数是数组,则它必须是数组,并且切片操作的结果是与数组具有相同元素类型的切片
在此表达式中:
getSlice()[:]
getString()[:]
getSlice()
返回一个数组,由于它是函数调用的结果,因此不可寻址。因此,您无法对其进行切片
在此表达式中:
getSlice()[:]
getString()[:]
getString()
返回一个string
值,因此即使该值不可寻址,也可以对其进行切片。这是允许的,因为切片表达式的结果将是另一个string
,并且Go中的string
值是不可变的
此外,变量是可变的,因此这将始终有效:
var a = getSlice()
fmt.Println(a[:])
getSlice()
没有返回片,而是返回一个不可寻址的数组。您可以返回指向数组的指针:
func getSlice() *[0]int {
return &[...]int{}
}
或者将getSlice()
保持原样,并将结果放入临时变量中:
t := getSlice()
fmt.Println(t[:])
getSlice()
没有返回片,而是返回一个不可寻址的数组。您可以返回指向数组的指针:
func getSlice() *[0]int {
return &[...]int{}
}
或者将getSlice()
保持原样,并将结果放入临时变量中:
t := getSlice()
fmt.Println(t[:])
你提出的解决方案就是我所做的。我不明白为什么它不能像字符串那样工作。现在我知道了,谢谢!你提出的解决方案就是我所做的。我不明白为什么它不能像字符串那样工作。现在我知道了,谢谢!