数组的定义和 初始化
数组是同一类型的元素集合
var a [3]int//定义⼀个数组
Go中数组下标从0开始,因此长度为n的数组下标范围:[0,n-1]
整数数组中的元素默认初始化为0,字符串数组中的元素默认初始化为" "
数组初始化
var a [3]inta[0] = 10a[1] = 20a[2] = 30//数组初始化
var a [3]int = [3]int{ 10, 20, 30}//定义时数组初始化
a := [3]int{ 10, 20, 30}//定义时数组初始化
a := […]int{ 10, 20, 30}//定义时数组初始化
a := [3]int{ 10}//定义时数组初始化
a := [3]int{ 2:10}//定义时数组初始化
package mainimport "fmt"// 数组初始化func test1() { var a [5]int a[0] = 1 a[1] = 2 a[2] = 3 fmt.Println(a) // [1 2 3 0 0]}func test2() { var a [5]int = [5]int{ 1, 2, 3, 4, 5} fmt.Println(a) // [1 2 3 4 5]}func test3() { a := [5]int{ 1, 2, 3, 4, 5} fmt.Println(a) // [1 2 3 4 5]}func test4() { a := [...]int{ 1, 2, 3, 4, 5} fmt.Println(a) // [1 2 3 4 5]}func test5() { a := [3]int{ 5} fmt.Println(a) //[5 0 0]}func test6(){ a := [5]int{ 3:30, 2:20} fmt.Println(a) //[0 0 20 30 0]}func main() { // test1() // test2() // test3() // test4() // test5() test6()}
数组的长度是类型的一部分
var a [3]int
a[0] = 10
a[1] = 20
a[2] = 30
var b [5]int
b = a // 报错 a、b是不同类型的数组,不能赋值
package mainimport "fmt"func test1() { // var a [3]int; // b := [4]int{1,2,3,4} // a = b 报错 不是 同类型的数组 不能直接 赋值 var c [4]int d := [4]int{ 1, 2, 3, 4} c = d fmt.Printf("c=%v\n", c) fmt.Printf("d=%v\n", d)}/*c=[1 2 3 4]d=[1 2 3 4]*/func main() { test1() }
数组的遍历
方式一
var a [3]inta[0] = 10a[1] = 20a[2] = 30for i := 0; i < len(a); i++ {}
方式二
var a [3]inta[0] = 10a[1] = 20a[2] = 30for index, val := range a {}
举例
package mainimport "fmt"func test1() { a := [5]int{ 1, 2, 3, 4, 5} for i := 0; i < len(a); i++ { fmt.Printf("a[%d]=%d\n", i, a[i]) }}func test2(){ a := [5]int{ 1, 2, 3, 4, 5} for index, val := range a { fmt.Printf("a[%d]=%d\n", index, val) }}/*a[0]=1a[1]=2a[2]=3a[3]=4a[4]=5*/func main() { // test1() test2()}
二维数组
package mainimport "fmt"func test1() { var a [3][2]int a[0][0] = 1 a[0][1] = 2 a[1][0] = 3 a[1][1] = 4 a[2][0] = 5 a[2][1] = 6 fmt.Println(a) // [[1 2] [3 4] [5 6]]}func test2() { var a [3][2]int = [3][2]int{ { 1, 2}, { 3, 4}, { 5, 6}} for i := 0; i < len(a); i++ { for j := 0; j < len(a[i]); j++ { fmt.Printf("a[%d][%d] = %d\n", i, j, a[i][j]) } fmt.Printf("\n") }}func test3(){ var a [3][2]int = [3][2]int{ { 1, 2}, { 3, 4}, { 5, 6}} for index, val := range(a){ for i,v:= range(val){ fmt.Printf("a[%d][%d] = %d\n", index, i ,v) } fmt.Printf("\n") }}func main() { // test1() // test2() test3()}
package mainimport ( "fmt")func printarray(a [3][2]string) { for _, v1 := range a { for _, v2 := range v1 { fmt.Printf("%s ", v2) } fmt.Printf("\n") }}func main() { a := [3][2]string{ { "lion", "tiger"}, { "cat", "dog"}, { "pigeon", "peacock"}, } printarray(a) var b [3][2]string b[0][0] = "apple" b[0][1] = "samsung" b[1][0] = "microsoft" b[1][1] = "google" b[2][0] = "AT&T" b[2][1] = "T-Mobile" fmt.Printf("\n") printarray(b)}
数组拷贝和传参
数组是值类型
var a [3]inta[0] = 10a[1] = 20a[2] = 30b := a//b了数组a中所有元素b[0] = 1000fmt.Println(a, b)
a [10,20,30]
b [1000,20,30]
数组是值类型,函数传参也会拷贝
func main() { var a [3]int a[0] = 10 a[1] = 20 a[2] = 30 modify(a) fmt.Println(a)}func modify(b [3]int) { b[0] = 1000 return}
a [10,20,30]
b [1000,20,30]
练习
求数组所有元素之和
package mainimport ( "fmt" "math/rand" "time")func test1(a [5]int) int { var sum int // for i := 0; i < len(a); i++ { // sum += a[i] // } for _, v := range a { sum += v } return sum}func run() int { rand.Seed(time.Now().Unix()) // 不设置 这个的话 rand.Intn() 取到的数据 都是 一样的 var a [5]int for i := 0; i < len(a); i++ { a[i] = rand.Intn(100) // rand.Intn(n) 随机取出 0 - n-1 的整数 // a[i] = rand.Int() // rand.Intn() 随机取出 0- int最大范围之间的 的整数 } sum := test1(a) return sum}func main() { sum := run() fmt.Println(sum)}
找出数组中和为给定值的两个元素的下标,例如数组:[1,3,5,8,7],找出两个元素之和等于8的下标分别是(0, 4)和(1,2)
package mainimport "fmt"// 找出数组中和为给定值的两个元素的下标,例如数组:[1,3,5,8,7],找出两个元素之和等于8的下标分别是(0, 4)和(1,2)func sumTwo(a [5]int, target int) { for i := 0; i < len(a); i++ { b := target - a[i] for j := i + 1; j < len(a); j++ { if b == a[j] { fmt.Printf("(%d, %d)\n", i, j) } } }}func main() { var a [5]int = [5]int{ 1, 2, 3, 7, 5} sumTwo(a, 8)}