1、初始化:数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变
//var a [...]int = [...]int{1, 2, 3} //error a := [...]int{1, 2, 3} var a2 [3]int = [3]int{4, 5, 6}
2、切片不需要指定大小
var s []int = []int{1, 2, 3, 4}
3、函数传递:
数组需要明确指定大小,切片不需要。数组是值传递,切片是地址传递
package main import "fmt" func changeArray(a [3]int) { a[0] = 100 } func changeSlice(s []int) { s[0] = 100 } func main() { //var a [...]int = [...]int{1, 2, 3} //error a := [...]int{1, 2, 3} changeArray(a) fmt.Println(a[0]) //值传递 var a2 [3]int = [3]int{4, 5, 6} a2[2] = 77 var s []int = []int{1, 2, 3, 4} fmt.Println(len(s), cap((s))) s = append(s, 6, 7, 8) fmt.Println(len(s), cap(s)) changeSlice(s) fmt.Println(s[0]) //地址传递 }
结果:
1 4 4 7 8 100
成功: 进程退出代码 0.
如果你在slice已经有多个参数,将其应用到一个复杂的函数func(slice...)。
func sum(nums ...int) { } func main() { nums := []int{1, 2, 3, 4} sum(nums...) }
1、select 默认是阻塞方法,可以同时接收多个channel;
2、如果select中,有time.After(3 * time.Second),可以实现超时,3秒后超时;
3、如果select中,有default选择,将变为非阻塞方法;