go 数组

时间:2020-12-22 02:39:49

数组的定义和 初始化

数组是同一类型的元素集合

var a []int
//定义⼀个数组

Go中数组下标从0开始,因此长度为n的数组下标范围:[0,n-1]

整数数组中的元素默认初始化为0,字符串数组中的元素默认初始化为" "

数组初始化

var a []int
a[] =
a[] =
a[] =
//数组初始化
var a []int = []int{, , }
//定义时数组初始化
a := []int{, , }
//定义时数组初始化
a := […]int{, , }
//定义时数组初始化
a := []int{}
//定义时数组初始化
a := []int{:}
//定义时数组初始化
package main

import "fmt"

// 数组初始化

func test1() {
var a []int
a[] =
a[] =
a[] =
fmt.Println(a) // [1 2 3 0 0] } func test2() {
var a []int = []int{, , , , }
fmt.Println(a) // [1 2 3 4 5]
} func test3() {
a := []int{, , , , }
fmt.Println(a) // [1 2 3 4 5]
} func test4() {
a := [...]int{, , , , }
fmt.Println(a) // [1 2 3 4 5]
} func test5() {
a := []int{}
fmt.Println(a) //[5 0 0]
} func test6(){
a := []int{:, :}
fmt.Println(a) //[0 0 20 30 0]
} func main() {
// test1()
// test2()
// test3()
// test4()
// test5()
test6() }

数组的长度是类型的一部分

var a []int

a[] =

a[] =

a[] =

var b []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 []int
d := []int{, , , }
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 []int
a[] =
a[] =
a[] =
for i := ; i < len(a); i++ { }

方式二

var a []int
a[] =
a[] =
a[] =
for index, val := range a {
}

举例

package main

import "fmt"

func test1() {
a := []int{, , , , }
for i := ; i < len(a); i++ {
fmt.Printf("a[%d]=%d\n", i, a[i])
}
} func test2(){
a := []int{, , , , }
for index, val := range a {
fmt.Printf("a[%d]=%d\n", 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 [][]int
a[][] =
a[][] =
a[][] =
a[][] =
a[][] =
a[][] = fmt.Println(a) // [[1 2] [3 4] [5 6]]
} func test2() {
var a [][]int = [][]int{{, }, {, }, {, }} for i := ; i < len(a); i++ {
for j := ; j < len(a[i]); j++ {
fmt.Printf("a[%d][%d] = %d\n", i, j, a[i][j])
}
fmt.Printf("\n")
}
} func test3(){
var a [][]int = [][]int{{, }, {, }, {, }}
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  main

import (
"fmt"
)
func printarray(a [][]string) {
for _, v1 := range a {
for _, v2 := range v1 {
fmt.Printf("%s ", v2)
}
fmt.Printf("\n")
}
}
func main() {
a := [][]string{
{"lion", "tiger"},
{"cat", "dog"},
{"pigeon", "peacock"},
}
printarray(a)
var b [][]string
b[][] = "apple"
b[][] = "samsung"
b[][] = "microsoft"
b[][] = "google"
b[][] = "AT&T"
b[][] = "T-Mobile"
fmt.Printf("\n")
printarray(b)
}

数组拷贝和传参

数组是值类型

var a []int
a[] =
a[] =
a[] =
b := a
//b了数组a中所有元素
b[] =
fmt.Println(a, b)

a [10,20,30]

b [1000,20,30]

 数组是值类型,函数传参也会拷贝

func main() {
var a []int
a[] =
a[] =
a[] =
modify(a)
fmt.Println(a)
}
func modify(b []int) {
b[] =
return
}

a [10,20,30]

b [1000,20,30]

练习

求数组所有元素之和

package main

import (
"fmt"
"math/rand"
"time"
) func test1(a []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 []int
for i := ; i < len(a); i++ {
a[i] = rand.Intn() // 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 []int, target int) {
for i := ; i < len(a); i++ {
b := target - a[i]
for j := i + ; j < len(a); j++ {
if b == a[j] {
fmt.Printf("(%d, %d)\n", i, j)
}
}
}
} func main() {
var a []int = []int{, , , , }
sumTwo(a, ) }