• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Golang > Go语言中的Array、Slice、Map和Set使用详解

Go语言中的Array、Slice、Map和Set使用详解

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了go语言 slice,go语言 map,go语言,go语言环境搭建,go语言程序设计等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Array(数组)

内部机制

在 Go 语言中数组是固定长度的数据类型,它包含相同类型的连续的元素,这些元素可以是内建类型,像数字和字符串,也可以是结构类型,元素可以通过唯一的索引值访问,从 0 开始。

数组是很有价值的数据结构,因为它的内存分配是连续的,内存连续意味着可是让它在 CPU 缓存中待更久,所以迭代数组和移动元素都会非常迅速。

数组声明和初始化

通过指定数据类型和元素个数(数组长度)来声明数组。

// 声明一个长度为5的整数数组
var array [5]int
</div>

一旦数组被声明了,那么它的数据类型跟长度都不能再被改变。如果你需要更多的元素,那么只能创建一个你想要长度的新的数组,然后把原有数组的元素拷贝过去。

Go 语言中任何变量被声明时,都会被默认初始化为各自类型对应的 0 值,数组当然也不例外。当一个数组被声明时,它里面包含的每个元素都会被初始化为 0 值。

一种快速创建和初始化数组的方法是使用数组字面值。数组字面值允许我们声明我们需要的元素个数并指定数据类型:
// 声明一个长度为5的整数数组
// 初始化每个元素
array := [5]int{7, 77, 777, 7777, 77777}
</div>
如果你把长度写成 ...,Go 编译器将会根据你的元素来推导出长度:
// 通过初始化值的个数来推导出数组容量
array := [...]int{7, 77, 777, 7777, 77777}
</div>

如果我们知道想要数组的长度,但是希望对指定位置元素初始化,可以这样:

// 声明一个长度为5的整数数组
// 为索引为1和2的位置指定元素初始化
// 剩余元素为0值
array := [5]int{1: 77, 2: 777}
</div>

使用数组

使用 [] 操作符来访问数组元素:

array := [5]int{7, 77, 777, 7777, 77777}
// 改变索引为2的元素的值
array[2] = 1
</div>
我们可以定义一个指针数组:

array := [5]*int{0: new(int), 1: new(int)}

// 为索引为0和1的元素赋值
*array[0] = 7
*array[1] = 77
</div>
在 Go 语言中数组是一个值,所以可以用它来进行赋值操作。一个数组可以被赋值给任意相同类型的数组:

var array1 [5]string
array2 := [5]string{"Red", "Blue", "Green", "Yellow", "Pink"}
array1 = array2
</div>
注意数组的类型同时包括数组的长度和可以被存储的元素类型,数组类型完全相同才可以互相赋值,比如下面这样就不可以:
var array1 [4]string
array2 := [5]string{"Red", "Blue", "Green", "Yellow", "Pink"}
array1 = array2

// 编译器会报错
Compiler Error:
cannot use array2 (type [5]string) as type [4]string in assignment
</div>
拷贝一个指针数组实际上是拷贝指针值,而不是指针指向的值:
var array1 [3]*string
array2 := [3]*string{new(string), new(string), new(string)}
*array2[0] = "Red"
*array2[1] = "Blue"
*array2[2] = "Green"

array1 = array2
// 赋值完成后,两组指针数组指向同一字符串
</div>

多维数组

数组总是一维的,但是可以组合成多维的。多维数组通常用于有父子关系的数据或者是坐标系数据:
// 声明一个二维数组
var array [4][2]int

// 使用数组字面值声明并初始化
array := [4][2]int{{10, 11}, {20, 21}, {30, 31}, {40, 41}}

// 指定外部数组索引位置初始化
array := [4][2]int{1: {20, 21}, 3: {40, 41}}

// 同时指定内外部数组索引位置初始化
array := [4][2]int{1: {0: 20}, 3: {1: 41}}
</div>

同样通过 [] 操作符来访问数组元素:
var array [2][2]int

array[0][0] = 0
array[0][1] = 1
array[1][0] = 2
array[1][1] = 3
</div>

也同样的相同类型的多维数组可以相互赋值:
var array1 = [2][2]int
var array2 = [2][2]int

array[0][0] = 0
array[0][1] = 1
array[1][0] = 2
array[1][1] = 3

array1 = array2
</div>

因为数组是值,我们可以拷贝单独的维:
var array3 [2]int = array1[1]
var value int = array1[1][0]
</div>

在函数中传递数组

在函数中传递数组是非常昂贵的行为,因为在函数之间传递变量永远是传递值,所以如果变量是数组,那么意味着传递整个数组,即使它很大很大很大。。。

举个栗子,创建一个有百万元素的整形数组,在64位的机器上它需要8兆的内存空间,来看看我们声明它和传递它时发生了什么:
var array [1e6]int
foo(array)
func foo(array [1e6]int) {
  ...
}
</div>
每一次 foo 被调用,8兆内存将会被分配在栈上。一旦函数返回,会弹栈并释放内存,每次都需要8兆空间。

Go 语言当然不会这么傻,有更好的方法来在函数中传递数组,那就是传递指向数组的指针,这样每次只需要分配8字节内存:
var array [1e6]int

您可能想查找下面的文章:

  • 深入解析Go语言编程中slice切片结构
  • Go语言中slice的用法实例分析
  • Go语言中的Array、Slice、Map和Set使用详解

相关文章

  • Go语言的代码组织结构详细介绍
  • Ubuntu安装Go语言运行环境
  • golang简单tls协议用法完整示例
  • linux中用shell快速安装配置Go语言的开发环境
  • Go语言map用法实例分析
  • Go语言中常量定义方法实例分析
  • Go语言method详解
  • Go语言压缩和解压缩tar.gz文件的方法
  • Go语言函数学习教程
  • Go语言的Windows下环境配置以及简单的程序结构讲解

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 初步解读Golang中的接口相关编写方法
    • Go语言实现Fibonacci数列的方法
    • go语言base64用法实例
    • Go语言中slice的用法实例分析
    • go语言实现顺序存储的栈
    • Go语言服务器开发之客户端向服务器发送数据并接收返回数据的方法
    • 详解Golang编程中的常量与变量
    • Golang的os标准库中常用函数的整理介绍
    • go语言简单的处理http请求的函数实例
    • Go语言实现的web爬虫实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有