数组定义:
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 并不会传回指针.