我是新去,想知道之间的区别[]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)调用某种类型的强制。谁能帮我吗?
该表达式[]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。
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |