Golang四大数据类型二:数组类型

ShawnLee_123 · · 295 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

数组

数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。

1. 声明方法

[32]byte                   //长度为32的数组
[2*N] struct {x, y int32}  //复杂类型数组
[100]*float64              //指针数组
[3][5]int                  //二维数组
[2][2][2]float64           //等同于[2]([2]([2]float64))

数组的长度在声明时就已经确定,后面不能再次修改。可以使用len()函数来求数组的长度。

2. 元素访问

使用下标访问数组,同C语言一样,下标也是从0开始

for i := 0; i < len(array); i++ {
    fmt.Println("Element", i, "of array is", array[i])
}

当然,我们也可以使用Go语言提供的range关键字来遍历数组。

for i, v := range array {
    fmt.Println("Element", i, "of array is", v)
}

3.值类型

Go语言中,数组是值类型,作为参数传递时,都会产生一次复制动作。所以,在函数中不能
将数组作为参数传递,因为在函数中操作的只不过是数组的副本而已。

package main

import "fmt"

func modify(array [5]int) {
    array[0] = 10
    fmt.Println("In Modify, array values:", array)
}

func main() {
    array := [5]int{1, 2, 3, 4, 5}
    modify(array)
    fmt.Println("In Main, array values:", array)
}

它的输出为:

In Modify, array values: [10 2 3 4 5]
In Main, array values: [1 2 3 4 5]

4.数组切片

在前面我们提到,数组有两个特性

  • 数组长度在定义后无法改变
  • 数组是值类型,在参数传递时会产生副本。
    这两大特性使得数组无法适应开发者的真实需求。所以我们使用数组切片(Slice)来弥补
    数组的不足。
    从底层的角度看,数组切片仍然使用数组来管理元素。基于数组,数组切片添加了一系列管理功能。可以随时动态扩充存放空间。并且在传参时不会产生复制。

4.1 基于数组创建数组切片

var marr [5]int = [5]int{1, 2, 3, 4, 5}
var mSlice []int = marr[:3]

Golang支持使用Array[first:last]的方式来基于数组生成一个数组切片。

4.2 直接创建数组切片

mySlice1 := make([]int, 5) //创建一个初始元素为5的数组切片,元素初始值为0
mySlice2 := make([]int, 5, 10)  //创建一个初始元素为5的数组切片,元素初始值为0,并且预留10个元素空间。
mySlice3 := []int{1, 2, 3, 4, 5} //创建,并初始化一个数组切片

4.3 遍历

同数组一样,我们可以使用下标或者range的方式遍历数组切片

4.4 动态增减元素

Go语言内置len()和cap()方法。len()函数返回数组切片当前存储的元素个数,cap()函数返回数组切片分配的空间大小。例如:

mySlice := make([]int, 5, 10)
len(mySlice) //5
cap(mySlice) //10

4.4.1 新增元素

如果想往上面的mySlice数组切片添加元素,可以使用append()函数。

mySlice = append(mySlice, 1, 2, 3) //mySlice末尾添加三个元素
mySlice2 := []int{8, 9, 10}
mySlice = append(mySlice, mySlice2...)  //将mySlice2数组切片添加到mySlice末尾。

5. 内容复制

Go语言另一个内置函数copy(),用于将内容从一个数组切片复制到另一个数组切片。如果两个数组切片不一样大。如果加入两数组切片不一样大,就会按较小的那个数组切片的元素个数进行复制。

slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}

copy(slice2, slice1) //只会复制slice1前三个元素到slice2中
copy(slice1, slice2) //只会复制slice2的3个元素到slice1的前三个位置。

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:ShawnLee_123

查看原文:Golang四大数据类型二:数组类型

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

295 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传