复合数据类型 数组 数组定义: var 数组变量名 [元素数量]T 数组的初始化 数组的遍历 多维数组 数组是值类型 数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变
复合数据类型
数组
数组定义:
var 数组变量名 [元素数量]T
数组的初始化
数组的遍历
多维数组
数组是值类型
数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。
- 数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的。
- [n]T表示指针数组,[n]T表示数组指针 。
点击查看代码
package main
import "fmt"
// 数组
// 存放元素的容器
// 必须指定存放的元素的类型和容量(长度)
// 数组的长度是数组类型的一部分
func main(){
var a1 [3]bool // [true false true]
var a2 [4]bool // [true true false false]
fmt.Printf("a1:%T a2:%T\n", a1, a2)
// 数组的初始化
// 如果不初始化:默认元素都是零值(布尔值:false,整型和浮点型都是0,字符串:"")
fmt.Println(a1, a2)
// 1. 初始化方式1
a1 = [3]bool{true, true, true}
fmt.Println(a1)
// 2. 初始化方式2 根据初始值自动推断数组的长度是多少
// a10 := [10]int{0,1,2,3,4,5,6,7,8,9}
a10 := [...]int{0,1,2,3,4,5,6,7,8,9}
fmt.Println(a10)
// 3. 初始化方式3 根据索引来初始化
// a3 := [5]int{1,2}
a3 := [5]int{0:1,4:2}
fmt.Println(a3)
// 数组的遍历
citys := [...]string{"北京", "上海", "深圳"} // 索引:0-2 citys[0],citys[1],citys[2]
// 1. 根据索引遍历
for i := 0; i < len(citys);i++{
fmt.Println(citys[i])
}
// 2. for range遍历
for i, v := range citys {
fmt.Println(i, v)
}
// 多维数组
// [[1,2][3,4][5,6]]
var a11 [3][2]int
a11 = [3][2]int{
[2]int{1, 2},
[2]int{3, 4},
[2]int{5, 6},
}
fmt.Println(a11)
// 多维数组的遍历
for _, v1 := range a11 {
fmt.Println(v1)
for _, v2 := range v1 {
fmt.Println(v2)
}
}
// 数组是值类型
b1 := [3]int{1,2,3} // [1 2 3]
b2 := b1 // [1 2 3] Ctrl+C Ctrl+V => 把world文档从文件夹a拷贝到文件夹b
b2[0] = 100 // b2:[100 2 3]
fmt.Println(b1, b2) // b1:?
}
- 练习
点击查看代码
package main
import "fmt"
// 求数组[1, 3, 5, 7, 8]所有元素的和
// 找出数组中和为指定值的两个元素的下标,比如从数组[1, 3, 5, 7, 8]中找出和为8的两个元素的下标分别为(0,3)和(1,2)。
func main(){
// 1. 求数组[1, 3, 5, 7, 8]所有元素的和
a1 := [...]int{1,3,5,7,8}
// 把数组中的每一个元素遍历出来,累加到一个sum变量就可以了
sum := 0
for _, v := range a1{
sum = sum + v
}
fmt.Println(sum)
// 找出和为8的两个元素的下标分别为(0,3)和(1,2)
// 定义两个for循环,外层的从第一个开始遍历
// 内层的for循环从外层后面的那个开始找
// 它们两个数的和为8
for i:=0;i<len(a1);i++{
for j:=i + 1;j<len(a1);j++{
if a1[i] +a1[j] == 8{
fmt.Printf("(%d, %d)\n", i, j)
}
}
}
}