一个数组是由零个或多个元素组成,因为Go语言中的数组长度是固定的,所以不会之间使用,在Go语言中,和数组对应的类型是Slice(切片),Slice 是可以增长和收缩的动态序列,功能也更灵活。 数组的每个元素可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。内置的len函数将返回数组中元素的个数。
一维数组
//一维数组的声明:var 数组变量名 [元素数量]Type
package main
import "fmt"
//定义一个长度为4的数组
var a = [4]int{
1, 2, 3, 4}
//...是根据初始化值的个数来定义
//var a = [...]int{1, 2, 3, 4}
//var c = [...]int{4:-1} --> [0,0,0,-1]
func main() {
/*
数组值的修改: 数组变量名[索引] = 修改的值
数组比较:==等于;!=不等
*/
//for循环打印出数组的索引i与值v
for i, v := range a {
fmt.Printf("%d-%d\n", i, v)
}
//for循环打印出数组的值v,_是将其索引丢弃
for _, v := range a {
fmt.Printf("%d\n", v)
}
}
多维数组
//多维数组声明:var array_name [size1][size2]...[sizen] array_type
package main
import (
"fmt"
)
//定义多维数组
//var b [3][3]int = [...][3]int{
{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
var b [3][3]int = [3][3]int{
{
1, 2, 3}, {
4, 5, 6}, {
7, 8, 9}}
func main() {
/*
// 声明一个二维整型数组,两个维度的长度分别是 4 和 2
var array [4][2]int
// 使用数组字面量来声明并初始化一个二维整型数组
array = [4][2]int{
{10, 11}, {20, 21}, {30, 31}, {40, 41}}
// 声明并初始化数组中索引为 1 和 3 的元素
array = [4][2]int{1: {20, 21}, 3: {40, 41}}
// 声明并初始化数组中指定的元素
array = [4][2]int{1: {0: 20}, 3: {1: 41}}
修改数组值
*/
//循环打印多维数组: 数组变量名[索引][索引] = 修改的值
for i, v := range b {
for j, z := range v {
fmt.Printf("%d-%d-%d\n", i, j, z)
}
}
}
切片Slic
/*
切片语法:slice [开始位置 : 结束位置]
语法说明如下:
slice:表示目标切片对象;
开始位置:对应目标切片对象的索引;
结束位置:对应目标切片的结束索引
使用方法:
slice[开始位置:] -->截取开始位置到数组的最后一个元素
slice[:结束位置] -->截取从开始元素到结束位置
slice[开始位置:结束位置] -- >截取从开始位置到结束位置的数组元素
slice[:] --> 生成与原数组一样的切片
slice[0:0] -->生成切片将为空
*/
package main
import "fmt"
//定义数组
var a = [4]int{
1, 2, 3, 4}
func main() {
//对数组进行切片
fmt.Println(a[1:4])
}
直接声明新的切片
/*
声明切片:var name []Type
其中 name 表示切片的变量名,Type 表示切片对应的元素类型。
*/
package main
import "fmt"
func main() {
// 声明字符串切片
var strList []string
// 声明整型切片
var numList []int
// 声明一个空切片
var numListEmpty = []int{
}
// 输出3个切片
fmt.Println(strList, numList, numListEmpty)
// 输出3个切片大小
fmt.Println(len(strList), len(numList), len(numListEmpty))
// 切片判定空的结果
fmt.Println(strList == nil) //ture
fmt.Println(numList == nil) //ture
fmt.Println(numListEmpty == nil) //false
//numListEmpty 已经被分配到了内存,但没有元素,因此和 nil 比较时是 false
numList = append(numList, 1, 2)//使用append向切片中添加元素
}
使用make()函数构造切片
/*
语法:make( []Type, size, cap )
其中 Type 是指切片的元素类型:
size 指的是为这个类型分配多少个元素
cap 为预分配的元素数量,这个值设定后不影响
size,只是能提前分配空间,降低多次分配空间造成的性能问题
*/
package main
import "fmt"
func main() {
a := make([]int, 2)
b := make([]int, 2, 10)
fmt.Println(a, b) //[0 0] [0 0]
fmt.Println(len(a), len(b)) //2 2
//使用append向切片中添加元素
a = append(a, 1, 2, 3)
fmt.Println(a) //[0 0 1 2 3]
}
append为切片添加元素
package main
import "fmt"
var a []int
func main() {
a = append(a, 1) //在切片末尾添加一个元素
fmt.Println(a) //[1]
a = append(a, 1, 2) //在切片末尾添加两个元素
fmt.Println(a) //[1,1,2]
a = append(a, []int{
1, 2, 3}...) //在切片末尾添加一个切片
fmt.Println(a) //[1,1,2,1,2,3]
a = append([]int{
0},a...) //在切片开头添加一个元素
fmt.Println(a) //[0,1,1,2,1,2,3]
a = append([]int{
-1,-2},a...) //在切片开头添加一个切片
fmt.Println(a) //[-1 -2 0 1 1 2 1 2 3]
}