Go中[] Foo(nil)和[] Foo {}之间的区别

rwa*_*e61 -1 arrays struct go

我是新去,想知道之间的区别[]Foo(nil)[]Foo{}

(我在测试中使用此函数,我想在此指定函数错误时应返回nil, err。go linter在使用nil或时会抱怨[]Foo{},但在使用时会起作用[]Foo(nil)。)

我尝试过的

我在Go文档和SO上进行了查看,发现Struct的内容有关,Foo{}但没有[]Foo(nil)

当我使用时[]Foo{},测试失败输出:

expected: []Foo{}
actual  : []Foo(nil)
Run Code Online (Sandbox Code Playgroud)

为FMT输出[]Foo(nil)[]Foo{}是相同的:

fmt.Println([]Foo(nil)) // []
fmt.Println([]Foo(){}) // []
fmt.Printf([]Foo(nil)) // []Foo
fmt.Printf([]Foo(){}) // []Foo
Run Code Online (Sandbox Code Playgroud)

我注意到,如果我只写Foo(nil)(不写[]),则短绒猫抱怨cannot convert nil to type Foo

因此,我唯一的猜测就是[]Foo(nil)调用某种类型的强制。谁能帮我吗?

Cer*_*món 9

该表达式[]Foo(nil)是一个转换。它将未类型化的nil转换为type的nil slice []Foo

该表达式[]Foo{}是一个复合文字,它返回一个空切片。由于没有在之间列出任何元素,因此为空{}

这可能有助于解释差异:

fmt.Println([]Foo(nil) == nil) // prints true
fmt.Println([]Foo{} == nil)    // prints false
Run Code Online (Sandbox Code Playgroud)

无切片没有支持数组。空切片具有长度为0的支持数组。

令人困惑的是,fmt包可以为空片和nil片输出相同的数据。

如果在测试中nil切片和空切片之间的区别并不重要,请使用进行测试len(s) == 0。对于零个切片和空切片,此表达式的计算结果均为true。