總結:
- 結構體切片傳入的結構體爲nil時,其結構爲[],有一個長度
- 一旦聲明一個切片,其結構爲空,長度爲0,但值不爲nil
遇到的坑的demo如下:
type Cat struct {
}
//打印該切片,發現爲[<nil>]
func main() {
cats := showCats()
fmt.Printf("cats:%v, len(cats):%v\n", cats, len(cats))
}
//將值爲nil的cat加入[]*cat切片中
func showCats() []*Cat {
var cats []*Cat
cat := createCat()
cats = append(cats, cat)
return cats
}
//生成一個nil的cat
func createCat() *Cat {
return nil
}
Output:
cats:[<nil>], len(cats):1
這裏可以看到cats裏的顯示的爲一個空的結構體,其長度爲1。這並不是我們想要的一個空切片。
所以代碼有以下修改:
type Cat struct {
}
//打印該切片,發現爲[<nil>]
func main() {
cats := showCats()
fmt.Printf("cats:%v, len(cats):%v\n", cats, len(cats))
}
//將值爲nil的cat加入[]*cat切片中
func showCats() []*Cat {
var cats []*Cat
cat := createCat()
if cat != nil {
fmt.Println("cat", cat)
cats = append(cats, cat)
} else {
fmt.Println("cat is nil", cat)
}
return cats
}
//生成一個nil的cat
func createCat() *Cat {
return nil
}
這裏從createCat()裏拿到數據後就進行判斷,如果爲nil,不進行append進去。結果也是我想要的。
Output:
cat is nil <nil>
cats:[], len(cats):0
坑2:
func main() {
cats := make([]int, 0)
fmt.Println(cats == nil)
fmt.Println(len(cats) == 0)
}
Output:
false
true