数组的定义和 初始化
数组是同一类型的元素集合
var a [3]int //定义⼀个数组
Go中数组下标从0开始,因此长度为n的数组下标范围:[0,n-1]
整数数组中的元素默认初始化为0,字符串数组中的元素默认初始化为" "
数组初始化
var a [3]int a[0] = 10 a[1] = 20 a[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 main import "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 main import "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 ", c) fmt.Printf("d=%v ", d) } /* c=[1 2 3 4] d=[1 2 3 4] */ func main() { test1() }
数组的遍历
方式一
var a [3]int a[0] = 10 a[1] = 20 a[2] = 30 for i := 0; i < len(a); i++ { }
方式二
var a [3]int a[0] = 10 a[1] = 20 a[2] = 30 for index, val := range a { }
举例
package main import "fmt" func test1() { a := [5]int{1, 2, 3, 4, 5} for i := 0; i < len(a); i++ { fmt.Printf("a[%d]=%d ", i, a[i]) } } func test2(){ a := [5]int{1, 2, 3, 4, 5} for index, val := range a { fmt.Printf("a[%d]=%d ", index, val) } } /* a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5 */ func main() { // test1() test2() }
二维数组
package main import "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 ", i, j, a[i][j]) } fmt.Printf(" ") } } 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 ", index, i ,v) } fmt.Printf(" ") } } func main() { // test1() // test2() test3() }
package main import ( "fmt" ) func printarray(a [3][2]string) { for _, v1 := range a { for _, v2 := range v1 { fmt.Printf("%s ", v2) } fmt.Printf(" ") } } 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(" ") printarray(b) }
数组拷贝和传参
数组是值类型
var a [3]int a[0] = 10 a[1] = 20 a[2] = 30 b := a //b了数组a中所有元素 b[0] = 1000 fmt.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 main import ( "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 main import "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) ", i, j) } } } } func main() { var a [5]int = [5]int{1, 2, 3, 7, 5} sumTwo(a, 8) }