Go语言入门-常用数据结构之数组
定义
概述
An array is a numbered sequence of elements of a single type, called the element type. The number of elements is called the length of the array and is never negative.-数组是单一类型元素(元素类型)组成并且被编号序列。 元素的数量称为数组的长度,绝不能为负。
这句话体现数组的几个特点:
- 数组中元素的类型是一致的
- 数组中元素是被编号的(具备下标)
- 数组有长度
实际上除了以上特点之外数组还有以下特性:
- 数组的长度是固定的,因此在数组定义的时候确定,确定后无法改变
- 长度是数据类型的组成部分。当元素类型相同,长度不相同时,不是同一类型。
- 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界(下标在合法范围之外),则触发访问越界,会panic。
- 数组是值类型。赋值和传递参数是整个数组。而不是指针。—此处重点。
数组定义
数据定义语法
var ArrayName [ArrayLength]Type
数组定义示例
- 简单示例1
func main() {
//var ArrayName [ArrayLength]Type
var arr1 [4]int
var arr2 [5]int
var arr3 [unsafe.Sizeof(arr1)]int //长度可以不是常量,但是编译时能够确认
fmt.Println(arr1)
fmt.Println(arr2)
fmt.Println(arr3)
}
/**
output:
[0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
*/
数组的长度不一定常量,但是一定是需要在编译器编译能够确认。
数据类型
长度是数据类型的组成部分。当元素类型相同,长度不相同时,不是同一类型
- 简单示例1
func main() {
var arr1 [4]int
var arr2 [5]int
var arr3 [5]int
fmt.Printf("arr1 type: %T\n", arr1)
fmt.Printf("arr2 type: %T\n", arr2)
fmt.Printf("arr3 type: %T\n", arr3)
//编译报错:类型不一样无法赋值
//arr1 = arr2 //Cannot use 'arr2' (type [5]int) as type [4]int in assignment
//类型相同可以赋值
arr2[0] = 10
fmt.Println(arr3)
arr3 = arr2
fmt.Println(arr2)
fmt.Println(arr3)
}
/**
output:
arr1 type: [4]int
arr2 type: [5]int
arr3 type: [5]int
[0 0 0 0 0]
[10 0 0 0 0]
[10 0 0 0 0]
*/
进阶-多维数组
数组中嵌套数组
基本定义如下:
//多维数组
func main() {
var arrays2 [5][4]int //二维数组
var arrays3 [2][2][3]int //三维数组
fmt.Println(arrays2)
fmt.Println(arrays3)
}
/**output:
[[0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]
[[[0 0 0] [0 0 0]] [[0 0 0] [0 0 0]]]
*/
数组初始化
一维数组
列表表达式初始化-基本
- 示例1
func main() {
var arr1 [3]int //定义数组,基础值被清零
var arr2 = [5]int{
3,1} //初始化表达式初始化,由于长度是5,只初始化前两位
var arr3 = [4]string{
"int", "float", "string"} //初始化列表表达式,只初始化前3位置
fmt.Println(arr1)
fmt.Println(arr2)
fmt.Println(arr3)
}
/**
output:
[0 0 0]
[3 1 0 0 0]
[int float string ]
*/
列表表达式初始化-自动推导数组长度
使用初始表示式中的时候可以使用[…]Type{}自动推断数组长度。
- 示例1
func main