Go语言学习——5、数组array、动态数组slice、字典map

本文主要介绍Go语言中数组、切片和Map的相关知识。包括数组的定义方式、简约声明及多维数组;切片作为“动态数组”的声明、定义、简便操作和深入理解;Map的定义、创建和使用,如通过key检索数据,使用hash表实现等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数组array

1.1、定义方式:

var arr  [n] type

其中,n为长度,type为类型。具体使用如下:

var  arr  [10] int	//声明一个 int 类型的数组
arr[0] = 42	//赋值操作
arr[1] = 13	//赋值操作
fmt.Printf("the first element is %d\n", arr[0])	//下标获取值,返回42
fmt.Printf("the last element is %d\n", arr[9])	//最后一个元素未赋值,默认返回0

1.2、简约方式声明【:=】

a := [3] int {1,2,3}	 //	声明了一个长度为3的int数组
b :=[10] int {1,2,3}	//声明一个长度为10的数组,前三个元素被初始化为1、2、3,其余部分默认为0
c :=[...] int {4,5,6}	//省略长度采用‘...’的方式,Go语言会自动根据元素个数来计算长度

1.3、多维数组

Go语言支持嵌套数组,即多维数组。如下代码声明了一个二维数组:

//声明一个二维数组,该数组以两个数组作为元素,其中每个数组又有4个int类型的元素
doubleArray := [2][4] int {[4] int {1,2,3,4}, [4] int {5,6,7,8}}

//简化上述声明,直接忽略内部类型
easyArray := [2][4] int {{1,2,3,4},{5,6,7,8}}

数组的分配如图:
在这里插入图片描述
图 多维数组的映射关系

二、切片slice(“动态数组”)

如果初始定义数组时,不知道数组的长度,就需要“动态数组”,在Go语言中这种结构叫 slice。

注意:slice并非真正意义上的数组,它只是一个引用类型,指向一个底层数组array。

2.1、声明与定义

2.1.1 直接初始化
//和array一样,只是少了长度
var fslice []int

初始化数据

fslice := []byte {'a','b','c','d'}
2.1.2 基于数组或已有slice初始化

slice可以从一个数组或已经存在的slice中再次声明。slice通过 array[i:j] 来获取,其中 i 是数组的开始位置,j 是结束位置,但不包含arr[j],它的长度是 j-i。

//声明一个包含10个元素,且元素类型为type的数组
var ar =[10]{'a','b','c','d','e','f','g','h','i','j'}

//声明两个含有byte类型元素的slice
var a,b []byte

//a指向数组的第三个到第五个元素:ar[2]、ar[3]、ar[4]
a = ar[3:5]

//b指向数组的第四和第五个元素:ar[3]、ar[4]
b = ar[4:5]

声明数组时,方括号内必须要有具体的长度或者使用…来自动计算长度。而声明slice时,方括号内没有任何字符。

2.2、一些简便操作

slice默认开始位置是0,结束位置为数组的长度,如:

var ar =[10]{'a','b','c','d','e','f','g','h','i','j'}
var aslice
aslice = ar[:]	//等价于 aslice = arr[0:10]

从slice中获取slice:

var bslice
bslice = aslice[5:]	//等价于 bslice = aslice[5:10]

注:slice是引用类型,所以当引用改变其中元素值时,其他的所有引用都会改变该值。
即,ar改变会影响aslice,aslice改变会影响bslice

2.3、深入理解slice

我个人感觉,它和vector有相似之处。vector是三个指针:

  • start
  • finish
  • end_of_storage
    在这里插入图片描述
    从概念上,slice像一个结构体,包含了三个元素:
  • 指针,指向起始位置
  • 长度,即slice的长度
  • 最大长度,即slice开始位置到数组(被引用的数组)的最后位置的长度
    在这里插入图片描述

三、Map

Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。

3.1、定义 Map

可以使用内建函数 make 也可以使用 map 关键字来定义 Map:

/* 声明变量,默认 map 是 nil(零值) */
var map_variable map[key_data_type]value_data_type

/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)

如果不初始化 map,那么就会创建一个 nil map(空map)。nil map 不能用来存放键值对。

3.2、创建和使用map

package main

import "fmt"

func main() {
    var countryCapitalMap map[string]string /*创建集合 */
    countryCapitalMap = make(map[string]string)

    /* map插入key - value对,各个国家对应的首都 */
    countryCapitalMap [ "France" ] = "巴黎"
    countryCapitalMap [ "Italy" ] = "罗马"
    countryCapitalMap [ "Japan" ] = "东京"
    countryCapitalMap [ "India " ] = "新德里"

    /*使用键输出地图值 */ 
    for country := range countryCapitalMap {
        fmt.Println(country, "首都是", countryCapitalMap [country])
    }

    /*查看元素在集合中是否存在 */
    capital, ok := countryCapitalMap [ "American" ] /*如果确定是真实的,则存在,否则不存在 */
    /*fmt.Println(capital) */
    /*fmt.Println(ok) */
    if (ok) {
        fmt.Println("American 的首都是", capital)
    } else {
        fmt.Println("American 的首都不存在")
    }
}

运行结果:

France 首都是 巴黎
Italy 首都是 罗马
Japan 首都是 东京
India  首都是 新德里
American 的首都不存在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值