Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 对函数的返回片寻址时出错_String_Go_Call_Slice - Fatal编程技术网

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[:])

你提出的解决方案就是我所做的。我不明白为什么它不能像字符串那样工作。现在我知道了,谢谢!你提出的解决方案就是我所做的。我不明白为什么它不能像字符串那样工作。现在我知道了,谢谢!