數組定義:
1.用var定義(必須給定長度)
eg: var arr [3] int
2.如果用 := (必須定義初值)
eg: arr := [3]int{1,2,3}
3.數組長度定義爲[...] ,這樣可以不用寫數字來定義長度,它會根據初值自動給與長度。否則數組必須定義長度
arr3 := […]int {1,2,3,4,5,6}
切片定義:
最簡單的理解:空的數組就是切片 (我個人就是這樣來理解)
eg: var arr [] int 不定義長度和初始值
對比來解釋:
- 數組它是值類型 ,而切片時指針類型,
- 一般初始化的時候數組的長度液晶是固定的了,而切片不是,它是一個動態的數組切片的底層是數組,而切片的底層是數組
關於循環:
數組循環有2種方式:
一:遍歷:
eg: arr := [3]int{1,2,3}
for i:=0 ; i<len(arr);i++{
fmt.Println(arr[i])
}
二:使用關鍵字:range
for i,v :=range(arr){ // i爲index,v爲值
fmt.Println(i,v)
}
注意點: 函數傳遞時傳遞數組,那就必須要傳遞一個數組長度相同的數組變量,因此 在實際開發中 ,我們常用的是切片
make與new 區別:
new
new 可以用來初始化泛型,並且返回儲存位址。所以通常我們會用指針變數來接收 new 過後。特別注意的是,
new 會自動初始化類型,也就是字串會是"",number 會是 0,而 channel, func, map, slice 等等則會是 nil。
因爲這個特性,如果我們對 map 做以下的操作的話,會出現 panic: assignment to entry in nil map
func main() {
user := new(map[string]string)
u := *user
u["name"] = "csq" // panic: assignment to entry in nil map
}
錯誤的原因:
初始化的 map 默認是 nil map,所以直接使用就會報assignment to entry in nil map 的錯誤。
如果用 struct 做初始化,也可以直接用 & 代表指向的地址
ype User struct {
Name string
Age int
}
func main() {
p := &User{} //這個可以自定義屬性
//或者
p := new(User)//這個全部講屬性賦予進去
}
make
make 與 new 不同,是用來初始化 channel, map, slice 等等。另外特別要注意的是 make 並不會傳回指針,如果要拿到指針,就要考慮用像是 new 的方式來初始化.
func main() {
user := make(map[string]string)
user := make([]string, 100) // 初始化長度 100
}
func main() {
user := make(map[string]string)
fmt.Println(*user) // invalid indirect of user 報錯
}
報錯原因:
make 並不會傳回指針.