a. 使用var
var c1 chan int
fmt.Println(c1) // <nil>
var c2 map[string]int
fmt.Println(c2) // map[]
c2[“a”] = 1 // error :panic: assignment to entry in nil map
var c3 [] int
fmt.Println(c3) // []
c3[0] = 1 // error :panic: runtime error: index out of range
以上用var初始化三种类型,仅仅是声明,并不能使用
b. 使用 var 或者 :=
var c2 map[string]int = map[string]int{}
fmt.Println(c2) // map[]
var c3 []int = [] int {1,2,3 }
var c4 []int = arr[:]
var a,b ,c = 3, true,"abc"
fmt.Println(a,b,c)
a1,b2 ,c3 := 3, true,"abc"
fmt.Println(a1,b2,c3)
左边都可以换成 c :=
在方法内部可以用:=定义一个变量,但是在方法外部不能,只能使用”var s =1” ,在方法外部的每一行都需要关键字,比如var ,func等
不管方法内还是方法外,多个变量声明时都可以使用:
var (
a =1
b =2
c =3
)
c. make
- 创建切片
s = make([] int ,10 )
- 创建map
m = make(map[string]int)
- 创建管道
c = make(chan int )
创建:
t1 := make([] int ,10)
fmt.Println(t1) // [0 0 0 0 0 0 0 0 0 0]
t3 := make(chan int)
fmt.Println(t3) // 0xc42007a060
t4 := make(map[string]int)
fmt.Println(t4) // map[]
组合:
t6 := make([]map[string]int ,5)
fmt.Println(t6) // [map[] map[] map[] map[] map[]]
//t6[0]["a"] = 1 // error panic: assignment to entry in nil map
t6[0] = make(map[string]int)
t6[0]["a"] = 1
fmt.Println(t6) //[map[a:1] map[] map[] map[] map[]]
t5 := make([] chan int ,5)
fmt.Println(t5) // [<nil> <nil> <nil> <nil> <nil>]
t7 := make([] User ,5)
fmt.Println(t7) // [{ 0 0 } { 0 0 } { 0 0 } { 0 0 } { 0 0 }]
t7[0].Age = 1
fmt.Println(t7) // [{ 1 0 } { 0 0 } { 0 0 } { 0 0 } { 0 0 }]
可见,map和chan的类型切片,里面的每个元素是不能直接用的,因为是nil,使用的时候必须对每个元素进行再次make
但是结构体的切片中,每个元素是可以直接用的
func main() {
s := make([]int, 5)
s = append(s, 1, 2, 3)
fmt.Println(s) // [0 0 0 0 0 1 2 3] ,而不是[1 2 3]
}
make初始化是由默认值的哦,此处默认值为0