数组
数组是存放元素的容器,必须指定存放的元素的类型和容量(长度)
数组的定义
var 数组变量名 [元素个数] T类型
// 如
var arr=[3]int
数组的长度是数组类型的一部分
package main
import "fmt"
func main() {
var a1 [3]bool
var a2 [3]bool
fmt.Printf("a1:%T a2:%T \n",a1,a2)
}
所以两数组是不能用==来比较和=来赋值
数组的初始化
package main
import "fmt"
func main() {
var a1 [3]bool
var a2 [3]bool
fmt.Printf("a1:%T a2:%T \n", a1, a2) // a1:[3]bool a2:[3]bool
// 初始化方式1
a1 = [3]bool{true, true, true} // [true true true]
fmt.Println(a1)
// 初始化方式2 根据初始值自动推断
a10 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} // [1 2 3 4 5 6 7 8 9 10]
fmt.Println(a10)
// 初始化方式3 根据索引来初始化
a3 := [5]int{1, 3} // [1 3 0 0 0]
fmt.Println(a3)
a3 = [5]int{0: 1, 2: 3} // [1 0 3 0 0]
fmt.Println(a3)
}
数组的遍历
package main
import "fmt"
func main() {
arr:=[3]string{"成都","上海","北京"}
for i, s := range arr {
fmt.Println(i,s)
}
for i := 0; i < len(arr); i++ {
fmt.Println(i,arr[i])
}
}
多维数组
package main
import "fmt"
func main() {
arr:=[3][3]int{
[3]int{1,3,4},
[3]int{1,3,4},
[3]int{1,3,4},
}
fmt.Println(arr) // [[1 3 4] [1 3 4] [1 3 4]]
arr:=[3][3]int{
{1,3,4},
{1,3,4},
{1,3,4},
}
fmt.Println(arr) // [[1 3 4] [1 3 4] [1 3 4]]
}
数组是值类型
package main
import "fmt"
func main() {
arr:=[3]int{1,3,4}
arr2:=arr
arr2[1]=1
fmt.Println(arr)
fmt.Println(arr2)
}
切片(slice)
切面是一个相同元素可变长度的序列,它是对数组的封装,支持自动扩容,他是一个引用类型
切片的定义
var name [] T类型
func main() {
var a []string
var b []int
fmt.Println(a, b) // [] []
fmt.Println(a == nil, b == nil) // true true
a = []string{"a", "b", "c"}
b = []int{1, 2, 3}
fmt.Println(a, b) // [a b c] [1 2 3]
fmt.Println(a == nil, b == nil) // false false
// cap 方法获取切片的容量 len方法获取切片的长度
fmt.Printf("let:%d,cap:%d \n", len(a),cap(a)) // let:3,cap:3
fmt.Printf("let:%d,cap:%d \n", len(b),cap(b)) // let:3,cap:3
}
由数组得到切片
package main
import "fmt"
func main() {
var a []string
var b []int
fmt.Println(a, b) // [] []
fmt.Println(a == nil, b == nil) // true true
a = []string{"a", "b", "c"}
b = []int{1, 2, 3}
fmt.Println(a, b) // [a b c] [1 2 3]
fmt.Println(a == nil, b == nil) // false false
// cap 方法获取切片的容量 len方法获取切片的长度
fmt.Printf("let:%d,cap:%d \n", len(a), cap(a)) // let:3,cap:3
fmt.Printf("let:%d,cap:%d \n", len(b), cap(b)) // let:3,cap:3
a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := a1[0:4] // 取第0号到第3号元素 (左闭右开) [1 2 3 4]
fmt.Println(s1)
s2 := a1[:4] // 取第0号到第3号元素 (左闭右开) [1 2 3 4]
fmt.Println(s2)
s3 := a1[1:4] // 取第1号到第3号元素 (左闭右开) [2 3 4]
fmt.Println(s3)
s4 := a1[1:] // 取第1号后面的全部元素 [2 3 4 5 6 7 8 9]
fmt.Println(s4)
s5 := a1[:] // 全部 [1 2 3 4 5 6 7 8 9]
fmt.Println(s5)
// make 定义
a2:=make([]string,0,0)
fmt.Printf("let:%d,cap:%d \n", len(a2), cap(a2)) // let:0,cap:0
a3:=make([]int,1,3)
fmt.Printf("let:%d,cap:%d \n", len(a3), cap(a3)) // let:1,cap:3
}
切片是引用类型
package main
import "fmt"
func main() {
a1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
a2:=a1
a2[1]=0
fmt.Println(a2) // [1 0 3 4 5 6 7 8 9]
fmt.Println(a1) // [1 0 3 4 5 6 7 8 9]
}