go常見錯誤:結構體切片爲零值的坑

總結:

  1. 結構體切片中的有且只有一個結構體爲nil時,其總體結構的內容爲[],長度爲1(注意這裏的長度不是0)。
  2. 聲明一個空切片時,其結構爲空,長度爲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 {
	...
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章