什么是数组
这是一个古老的数据结构概念了:
有序、同类、定长的集合就是数组。
如何定义?
最标准的:
var arry_a [3]int = [3]int{1,2,3}
其他的
var arry_a [3]int //这种情况下,arry_a的三个元素将被赋默认零值
var arry_a [3]int =[3]int{1,2}//这种情况下,arry_a[2]将被赋默认零值
arry_a := [...]int{1,2,3}
arry_a := [3]int{1,2,3}
* 注意[3]int与[4]int是不同类型,不能把[4]int类型的值赋给[3]int类型的变量
* 强调一点,golang里面只有值传递,没有引用传递。所谓值传递可以看成暴力的内存拷贝。这一点在数组传值上体现地特别明显!
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
b := a
b[0] = 100
fmt.Println(a[0])
fmt.Println(b[0])
}
输出
1
100
如何遍历?
通常是通过关键字range,也可以按下标遍历
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
for value := range a {
fmt.Println(value)
}
fmt.Println("----------------")
for i := 0; i < len(a); i++ {
fmt.Println(a[i])
}
}
输出
0
1
2
----------------
1
2
3
关于==和!=
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
a1 := [3]int{1, 2, 3}
fmt.Println(a == a1)
fmt.Println(a != a1)
a2 := [3]int{1, 3, 2}
fmt.Println(a == a2)
fmt.Println(a != a2)
}
结果
true
false
false
true
这说明:当且仅当数组元素全部对应相等时,两个数组才相等,否则不等。
* 注意,由于[3]int与[4]int是不同类型,所以其值不可比较(会导致语法错误)!
关于make关键字
说起make就不得不说另一个关键字:new
package main
import (
"fmt"
"reflect"
"strconv"
)
func main() {
a := new([3]int)
a[0] = 100
a[1] = 200
a[2] = 300
b := make([]int, 3)
fmt.Println(reflect.TypeOf(a).String() + "-->" + strconv.Itoa(len(a)))
fmt.Println(reflect.TypeOf(b).String() + "-->" + strconv.Itoa(len(b)))
for i := 0; i < len(a); i++ {
fmt.Print(strconv.Itoa(a[i]) + " ")
}
fmt.Print("\n")
for i := 0; i < len(a); i++ {
fmt.Print(strconv.Itoa(b[i]) + " ")
}
fmt.Println("\n---------------------------------")
for index, val := range a {
fmt.Print(strconv.Itoa(index) + "->" + strconv.Itoa(val) + " ")
}
fmt.Print("\n")
for index, val := range b {
fmt.Print(strconv.Itoa(index) + "->" + strconv.Itoa(val) + " ")
}
}
输出
*[3]int-->3
[]int-->3
100 200 300
0 0 0
---------------------------------
0->100 1->200 2->300
0->0 1->0 2->0
make只能建立slice,map和channel三种类型;new没有限制。