總結:
- 結構體切片中的有且只有一個結構體爲nil時,其總體結構的內容爲[],長度爲1(注意這裏的長度不是0)。
- 聲明一個空切片時,其結構爲空,長度爲0,但值不爲nil。
demo1:
type Cat struct {
}
func main() {
cats := make([]Cat, 0) // Cat{}的切片
cat := Cat{} // nil
cats = append(cats, cat) // 將nil傳入空的切片中
fmt.Printf("cats: %v, len: %d\n", cats, len(cats))
// cats: [{}], len: 1
}
這裏可以看到cats裏的顯示的爲一個空的結構體,其長度爲1。
如果我們想要的一個空切片,代碼有以下修改:
type Cat struct {
}
func main() {
cats := make([]Cat, 0)
cat := Cat{}
if cats == nil || len(cats) == 0 { //增加一個是否爲nil的判斷
fmt.Println("cat is nil", cat)
} else {
fmt.Println("cat", cat)
cats = append(cats, cat)
}
fmt.Printf("cats: %v, len: %d\n", cats, len(cats))
//cat is nil {}
//cats: [], len: 0
}
這裏從createCat()裏拿到數據後就進行判斷,如果爲nil,不進行append進去。
demo2:
func main() {
cats := make([]int, 0)
fmt.Println(cats == nil) // false
fmt.Println(len(cats) == 0) // true
}
使用make出來的空的結構體長度爲0,但內容不爲nil。
綜上,判斷一個結構體爲空時,判斷條件最好寫爲:
if cats == nil || len(cats) == 0 {
...
}