8.19Go之容器之数组
知识回顾
到目前为止已经看完了的知识章节:
Go语言简介
Go语言基本语法
Go语言流程控制
Go语言函数--->需要深入
Go语言结构体--->需要深入
除了两部分的内容需要深入以外其他的内容其他的内容基本上能够达到使用的程度。
Go之容器(container)
内容简介:
数组
多维数组
切片
多维切片
map
list
容器的定义
概念:
-
具有各种形式的存储和处理数据的功能,将它们称为“容器(container)”。
特点:
-
容器是以标准库的方式提供,可以看源码
其他语言中的容器
-
C语言没有提供容器封装,开发者需要自己根据性能需求进行封装,或者使用第三方提供的容器。
-
C++ 语言的容器通过标准库提供,如 vector 对应数组,list 对应双链表,map 对应映射等。
Go语言数组
概念:
-
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。
和数组对应的类型是 Slice(切片),Slice 是可以增长和收缩的动态序列,
特点:
-
因为数组的长度是固定的,所以在Go语言中很少直接使用数组。
数组声明语法
var 数组变量名 [元素数量]Type
-
数组变量名:数组声明及使用时的变量名。
-
元素数量:数组的元素数量,可以是一个表达式,但最终通过编译期计算的结果必须是整型数值,元素数量不能含有到运行时才能确认大小的数值。
-
Type:可以是任意基本类型,包括数组本身,类型为数组本身时,可以实现多维数组。
直接定义数组长度:
示例:
package main
import "fmt"
func main() {
var arrays [3]int
for i := 0; i < len(arrays); i++ {
arrays[i] = i+1
}
//打印索引+元素
for j, k := range arrays {
fmt.Printf("第%d号索引的值是%d;\n", j, k)
}
//仅打印值--->使用_
for _, l := range arrays {
fmt.Printf("依次的值是%d;\n", l)
}
}
根据实际传入的值的数量定义数组的长度:
示例:
go不支持这种形式的赋值,会报数组索引越界的错误:
package main
import "fmt"
func main() {
var arraysNo2 [...]int
//循环赋值
for i := 0; i < 10; i++ {
arraysNo2[i] = i+1
}
//循环输出
for j, k := range arraysNo2 {
fmt.Printf("第%d号索引的值是%d;\n", j, k)
}
}
类似Java当中的:
public static void main(String[] args) {
int[] arr = new int[10];
for (int i=0; i<10; i++){
arr[i] = (i+1);
}
for (int num : arr){
System.out.println(num);
}
}
数组长度的位置出现“...”省略号,则表示数组的长度是根据初始化值的个数来计算
数组的长度是数组类型的一个组成部分, [3]int 和 [4]int 是两种不同的数组类型,数组的长度必须是常量表达式,数组的长度需要在编译阶段确定。
q:=[3]int{1,2,3}
q=[4]int{1,2,3,4}
/*编译错误*/
比较两个数组是否相等
-
使用比较运算符(
!=
,==
)进行比较--->数组的长度、元素类型要相同 -
不能比较两个类型不同的数组,否则程序将无法完成编译。
package main
import "fmt"
func main() {
a := [3]int{1,2,3}
b := [3]int{4,5,6}
c := [2]int{7,8}
fmt.Println(a == b, a != b)
fmt.Println(a == c) //无法编译通过
}
遍历数组,访问每一个元素--->使用切片的方法
package main
import "fmt"
var team [3]string
func main() {
team[0] = "SpiderMan"
team[1] = "HammerMan"
team[2] = "SunWuKong"
//使用切片的方法进行读取
for i, j := range team {
fmt.Printf("第%d位的值是%s\n", i, j)
}
}