go中結構體切片爲零值的坑

總結:

  1. 結構體切片傳入的結構體爲nil時,其結構爲[],有一個長度
  2. 一旦聲明一個切片,其結構爲空,長度爲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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章