Go语言学习(二):array、slices和map
来源:互联网 发布:常见的三大核酸数据库 编辑:程序博客网 时间:2024/05/17 18:23
前言
近来个多月忙于论文,各方面原因的综合,说多都是泪,等着结果了。关于Go语言的学习,本文的内容老早就学习了,之前时间也不知去哪了,而且也没心思,现在誊写上来吧。
数组array
定义形式: [n]<array>,n标示array长度,<type>标示类型。
<span style="font-family:SimSun;font-size:18px;">// e.g:[32]byte // 长度32的数组,每个元素为1个byte[16]*float64 // 指针数组[3][5]int // 二维数组</span>
在Go语言中,数组长度在定义后不可更改。获取array元素个数方法:arrLength := len(array)
元素访问与C一致。需要注意的一点,Go语言中数组属于值类型,不能像C一样用于指针传递。也就是说,如果数组作为函数入参,则在调用该函数时,函数将对数组做一份拷贝副本,函数修改的是副本上的内容。
<span style="font-family:SimSun;font-size:18px;">// e.gpackage mainimport "fmt"func modify(array [5]int) {array[0] = 10fmt.Println("In modify(), array values:", array[0])}func main() {array := [5]int{1, 2, 3, 4, 5}modify(array)fmt.Println("In main(), array values:", array[0])}</span>
数组切片slices
数组特点:长度在定义后无法再修改;值类型;
如果需要将数组作为函数入参,用于指针传递方式,这种情况下,Go语言就使用数组切片来满足该需求。因此,数组切片属于引用类型。
数组切片拥有自己的数据结构,可以抽象为以下3个变量:
- 一个指向原生数组的指针,即在底层仍旧开辟一个数组,数组切片结构中含有指向该数组的指针;
- 数组切片中的元素个数;
- 数组切片已分配的存储空间;
数组切片创建
- 基于数组
<span style="font-family:SimSun;font-size:18px;">// e.gvar myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}var mySlice []int = myArray[:5] // Go语言支持用myArray[first:last]格式选择数组元素</span>
- 直接创建
利用内置函数make()灵活创建,或者直接初始化创建。
<span style="font-family:SimSun;font-size:18px;">// e.gmySlice1 := make([]int, 5) // 创建元素个数为5的数组切片,默认初始化为0mySlice2 := make([]int, 5, 10) // 同上,但总共预留的是10个元素的存储空间mySlice3 := []int{1, 2, 3, 4, 5} // 直接创建并初始化包含5个元素的数组切片</span>
- 基于切片
<span style="font-family:SimSun;font-size:18px;">// e.goldSlice := []int{1, 2, 3, 4, 5}newSlice := oldSlice[:3] // 基于oldSlice的前3个元素构建新数组切片</span>类似于数组切片基于数组创建,与基于数组创建区别就是:基于旧有切片创建的新数组切面可以超过所包含的元素个数,超出元素部分初始化为0,但有一个限制就是不得超过旧有切片的存储空间。
动态增减元素
数组切片有一个存储能力的概念,即元素个数和分配空间可以是两个不同的值。为了大幅降低数组切片内部重新分配内存和搬送内存块频率,提供程序性能,需要我们合理设置存储能力的值。
数组切片支持Go语言内置的cap()和len()函数,cap()返回数组切片分配空间值,len()返回切片中存储的元素个数。
如果需要往mySlice已包含的元素后面继续新增元素,则使用append()内置函数。
<span style="font-family:SimSun;font-size:18px;">// e.gmySlice = append(mySlice, 1, 2, 3) // 添加普通元素mySlice = append(mySlice, mySlice1...) // 添加一个切片,注意后面“...”一定不能省略</span>数组切片会自动处理存储空间不足的问题。如果追加的内容长度超过当前已分配的存储空间,数组切片会自动分配一块足够大的内存。这也是之前说到要合理设置存储空间值的原因。
另外切片支持Go语言的内置函数copy(),用于将内容从一个切片复制给另一个切面。如果加入的两个切片不一样大,则按其中较小的那个切片的元素个数进行复制。
<span style="font-family:SimSun;font-size:18px;">// e.g slice1 := []int{1, 2, 3, 4, 5}slice2 := []int{5, 4, 3}copy(slice2, slice1) // 复制slice1的前三个元素到slice2中copy(slice1, slice2) // 复制slice2的3个元素到slice2的前3个位置</span>
键值对map
map是一堆键值对的未排序集合。
- 变量声明
<span style="font-family:SimSun;font-size:18px;">// e.gvar myMap map[string] PersonInfo</span>其中,myMap是声明的map变量名,string是?类型,PersonInfo则是其存放的值类型。
依旧使用内置函数make()来创建一个map。
<span style="font-family:SimSun;font-size:18px;">// e.gmyMap = make(map[string] PersonInfo, 100)</span>或者直接创建并初始化map的代码如下:
<span style="font-family:SimSun;font-size:18px;">// e.gmyMap = map[string] PersonInfo {"1234": PersonInfo{"1", "Jack", "Room 101, ..."}}</span>
- 添加:
<span style="font-family:SimSun;font-size:18px;">// e.gmyMap["456"] = PersonInfo{"2", "Bob", "Room 102, ..."}</span>
- 删除:
- 查找:
<span style="font-family:SimSun;font-size:18px;">// e.gvalue, ok := myMap["1234"]if ok {// 找到了, 处理...}</span>这几行代码表示只需查看第二个返回值ok即可,非常简单了。。
0 0
- Go语言学习(二):array、slices和map
- 35.笔记go语言——array、slices和map
- Go语言学习笔记 -- array、slice和map
- Go语言学习4:Slices
- Go语言中的 Array, Slice和 Map
- go语言的array,slice和map
- Go语言中的 Array, Slice和 Map
- go语言Exercise: Slices
- Go语言学习笔记(四) [array、slice、map]
- Go 语言中的 Array,Slice,Map 和 Set
- Go 语言中的 Array,Slice,Map 和 Set
- Go语言基础:array、slice、make和new操作、map
- Go学习笔记-Go语言数组array和切片slice
- go语言学习---map
- golang之集合(array,slices和map)
- Go语言学习三:Go基础(iota,array,slice,map,make,new)
- Go语言学习笔记 --- map
- [go语言]slice和map
- hadoop记录topk
- 最新安卓导航装车作业
- MYSQL执行外部sql脚本
- 玉蝴蝶 柳永 望处雨收
- 我想买个安卓导航,大家认为卡尔福怎么样
- Go语言学习(二):array、slices和map
- 复习recursion
- android Listview分批加载+自动加载(改进版)(附源码下载)
- 如何写一个不可变类
- 欧拉公式
- 卡尔福销量怎么样?
- 拨钟问题pku1166
- 女司机开车狂飙 三次碰撞后逃逸
- 【rcmp】@CQU2014 校赛_B.Board 标程阅读