Go Can';t返回nil,但切片的值为零
我遇到的情况是,函数具有以下代码:Go Can';t返回nil,但切片的值为零,go,Go,我遇到的情况是,函数具有以下代码: func halfMatch(text1, text2 string) []string { ... if (condition) { return nil // That's the final code path) } ... } 正在返回[]字符串(nil),而不是nil。起初,我认为在具有特定返回类型的函数中返回nil可能只会返回该类型的零值实例。但后来我尝试了一个简单的方法,但事实并非如此 有人知道
func halfMatch(text1, text2 string) []string {
...
if (condition) {
return nil // That's the final code path)
}
...
}
正在返回[]字符串(nil)
,而不是nil。起初,我认为在具有特定返回类型的函数中返回nil
可能只会返回该类型的零值实例。但后来我尝试了一个简单的方法,但事实并非如此
有人知道为什么
nil
会返回一个空的字符串片吗?我想你可能被打印输出搞糊涂了。()
产生
result = []
result = true
所以我认为输出真的是
nil
我相信我知道发生了什么。我使用的断言库()在内部使用了一个reflect.DeepEqual
func半匹配(text1,text2 string)[]string
的返回值始终为[]string
类型,但如果它返回nil
,并通过=
运算符与nil
值进行比较,它将返回true
。但是,如果<代码>反映,使用DePyQual,类型将是重要的,它不会考虑两个值相同。
Nil不是一种类型。它是对映射、通道、指针、函数、切片和接口的零值的描述 当您在程序中输入“nil”时,go会根据上下文为其指定一个类型。在大多数情况下,您永远不需要显式地键入nil。这也不例外,编译器知道它必须是[]字符串(nil),因为返回的类型是[]字符串
nil字符串片是一个没有后备数组且长度/容量为零的片。您可以将其与文字“nil”进行比较,并可以获得其长度和容量。它是一个[]字符串,只是空的。如果希望有一个不是nil的空[]字符串,请返回[]字符串{}。这将创建一个后备数组(长度为零),并使其不再等于nil。如果条件为真,Go将返回一个enpty切片 您的“测试”有一个问题,因为如果您尝试将[]与nil进行比较,则会得到true。 我修改了你的测试,让你明白我的意思
package main
import "fmt"
func main() {
//fmt.Println(test1("") == nil)
fmt.Println(test1("")) // prints []
}
func test1(text1 string) []string {
if len(text1) > 0 {
return []string{text1}
}
return nil
}
您的测试用例按预期工作,并返回nil。您能否生成一个行为与您遇到问题的代码类似的测试用例?很可能您的逻辑中有错误,正在返回到其他地方。我将尝试将其制作成更好的测试用例,但在我认为返回的
return
为nil
之前,我有一个Println
被打印出来,所以肯定是返回了语句。实际上我的断言失败了:assert.go:24:![]字符串(零)!=零
我想你是对的。由于DeepEqual
接受两个interface{}
值,reflect.DeepEqual(test1(“”,nil)
将导致DeepEqual
获取[]字符串{}
(零字符串切片)和接口{}
(零接口值),这两个操作将由于类型不匹配而失败。
package main
import "fmt"
func main() {
//fmt.Println(test1("") == nil)
fmt.Println(test1("")) // prints []
}
func test1(text1 string) []string {
if len(text1) > 0 {
return []string{text1}
}
return nil
}