go基础之基本数据结构(数组、slice、map)
go基本的数据结构有数组、slice、map,高级数据结构为结构体为用户自定义类型。本片文章主要讲解三大基本数据结构。
数组
数组是包含单个类型的元素序列,但是长度固定的数据类型,一个数组声明时需要指定数据类型和长度进行。例如定义长度为6的整形数组
var x [6]int
声明一个数组x用于存储int类型的元素且长度为6,所以数组x将由6个整数元素组成。
- 声明一个数组并赋值
import (
"fmt"
)
func main() {
var x [5]int
x[0] = 10
x[1] = 20
x[2] = 30
x[3] = 40
x[4] = 50
fmt.Println(x)
}
//输出为:
[10 20 30 40 50]
- 使用一行或者多行语句声明数组
x := [5]int{10, 20, 30, 40, 50}
x := [5]int{
10,
20,
30,
40,
50,
}
- 用…初始化数组
x := [...]int{10, 20, 30, 40, 50}
- 初始化为特定值
package main
import "fmt"
func main() {
x := [5]int{2: 10, 4: 40}
fmt.Println(x)
}
//输出为:
[0 0 10 0 40]
其中10赋值给第三个元素,40赋值给第五个元素。
slice
slice是一种非常类似于数组的数据结构,但没有指定的长度。它是一种基于数组类型构建的抽象,提供了一种更方便处理集合的方法。与常规数组不同,slice是动态数组,其中slice的长度可以在数据增加或收缩的时候进行更改。当无法预测有多少个元素要存储到集合中的时候,slice是非常有用的数据结构。
slice中有两个概念:一是len长度,二是cap容量,长度是指已经被赋过值的最大下标+1,可通过内置函数len()获得。容量是指slice目前可容纳的最多元素个数,可通过内置函数cap()获得。slice是引用类型,因此在当传递slice时将引用同一指针,修改值将会影响其他的对象。
- 定义一个空的Slice
var x []int
- 用make函数定义一个Slice
用make函数声明slice时,可以显式指定slice的长度和容量。
x := make([]int, 5,10) //声明长度为5,容量为10的slice
x := make([]int, 5) //声明长度为5的slice
- 直接定义并且初始化一个slice
x:= []int{10, 20, 30, 40, 50} //长度为5,容量为5
x:= []int{} //长度为0,容量为0,当你想从函数返回空集合时,空片是有用的。
- 初始化制定某个元素值
x := []int{4: 0} //第5个元素为0
- append和copy
切片可以通过内置函数append(slice []Type,elems…Type)追加元素,elems可以是一排type类型的数据,也可以是slice,如果将一个slice追加到另一个slice中需要带上”…”,这样才能表示是将slice中的元素依次追加到另一个slice中。
s :=append(s,1,2,3,4)
s :=append(s,s1...)
代码示例:
package main
import "fmt"
func main() {
x := []int{10,20,30}
y := append(x, 40, 50)
fmt.Println(x, y)
}
//输出为:
[10 20 30] [10 20 30 40 50]
package main
import "fmt"
func main() {
x := []int{10, 20, 30}
y := make([]int, 2)
copy(y, x)
fmt.Println(x, y)
}
//输出为
[10 20 30] [10 20]
- Length 和 Capacity
package main
import "fmt"
func main() {
x := make([]int, 2, 5)
x[0] = 10
x[1] = 20
fmt.Println(x)
fmt.Println("Length is", len(x))
fmt.Println("Capacity is", cap(x))
x = append(x, 30, 40, 50)
fmt.Println(x)
fmt.Println("Length is", len(x))
fmt.Println("Capacity is", cap(x))
fmt.Println(x)
x = append(x, 60)
fmt.Println("Length is", len(x))
fmt.Println("Capacity is", cap(x))
fmt.Println(x)
}
//输出为:
[10 20]
Length is 2
Capacity is 5
[10 20 30 40 50]
Length is 5
Capacity is 5
[10 20 30 40 50]
Length is 6
Capacity is 12
[10 20 30 40 50 60]
- 遍历slice
package main
import "fmt"
func main() {
x := []int{10, 20, 30, 40, 50}
for k, v := range x {
fmt.Printf("Index: %d Value: %d\n", k, v)
}
}
//输出为:
Index: 0 Value: 10
Index: 1 Value: 20
Index: 2 Value: 30
Index: 3 Value: 40
Index: 4 Value: 50
Map
哈希表是一种巧妙并且实用的数据结构。 它是一个无序的key/value对的集合, 其中所有的key都是不同的, 然后通过给定的key可以在常数时间复杂度内检索、 更新或删除对应的value。在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。map中所有的key都有相同的类型, 所有的value也有着相同的类型,但是key和value之间可以是不同的数据类型。 其中K对应的key必须是支持==比较运算符的数据类型,所以map可以通过测试key是否相等来判断是否已经存在。
package main
import "fmt"
func main() {
dict := make(map[string]string) //声明了一个key和value都是string类型的map
dict["go"] = "Golang" //向map加入一个元素
dict["cs"] = "CSharp"
dict["rb"] = "Ruby"
dict["py"] = "Python"
dict["js"] = "JavaScript"
for k, v := range dict {
fmt.Printf("Key: %s Value: %s\n", k, v)
}
delete(dict, "go") // 删除dict["go"]
fmt.Printf("after delete go in dict:\n")
for k, v := range dict {
fmt.Printf("Key: %s Value: %s\n", k, v)
}
}
//输出为:
Key: cs Value: CSharp
Key: rb Value: Ruby
Key: py Value: Python
Key: js Value: JavaScript
Key: go Value: Golang
after delete go in dict:
Key: cs Value: CSharp
Key: rb Value: Ruby
Key: py Value: Python
Key: js Value: JavaScript
在获取值的时候有可能不在map当中,所以一般这样用:
goString, ok := dict["go"]
if !ok { /* "go" is not a key in this map; goString== "". */ }
//或者
if goString, ok := dict["go"]; !ok{
/* "go" is not a key in this map; goString== "". */
}
go基础之基本数据结构(数组、slice、map)的更多相关文章
- 数据结构基础(1)--数组C语言实现--动态内存分配
数据结构基础(1)--数组C语言实现--动态内存分配 基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc(). 难点就是数 ...
- Go语言学习笔记(三)数组 & 切片 & map
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 数组 Arrays 数组是同一种数据类型的固定长度的序列. 数组是值类型,因此改变副本的值,不会改变本身的值: 当 ...
- 数据结构---Set和Map
1.Set数据结构 Set本质上是一个没有重复数据,但是具有irerator接口可以遍历的一种集合. Set本身也是一种数据结构的构造函数. 1.Set的初始化 var obj = new Set(参 ...
- golang(4):函数 & 数组 & 切片 & map & 锁
内置函数 // 1. close:主要用来关闭channel // 2. len:用来求长度,比如string.array.slice.map.channel // 3. new:用来分配内存,主要用 ...
- Go 语言入门 3-动态数组(slice)的特性及实现原理
go 语言中的动态数组(slice),是基于数组实现的,可以相比数组而言更加的灵活.其他语言的 slice 通常仅是一个 API, 但是 go 语言的 slice 不仅仅是一种操作, 也是一种数据结构 ...
- 【C/C++学院】0828-数组与指针/内存分配/数据结构数组接口与封装
[送给在路上的程序猿] 对于一个开发人员而言,可以胜任系统中随意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并能够运用到系统中.由此简化系统的开发,是其架构生涯的第一步. ...
- ES6——新增数据结构Set与Map的用法
ES6 提供了新的数据结构 Set以及Map,下面我们来一一讲解. 一.Set 特性 似于数组,但它的一大特性就是所有元素都是唯一的,没有重复. 我们可以利用这一唯一特性进行数组的去重工作. 1.单一 ...
- paip.提升性能---并行多核编程哈的数据结构list,set,map
paip.提升性能---并行多核编程哈的数据结构list,set,map vector/copyonwritearraylist 都是线程安全的. 或者经过包装的list ::: collection ...
- JavaSE语法基础(3)---函数、数组
JavaSE语法基础(3)---函数.数组 函数的概念:实现特定功能的一段代码,可反复使用. 函数的出现减少代码冗余,提高代码的复用性,可读性,可维护性,可以使每个功能模块独立起来,方便分工合作. 函 ...
随机推荐
- 每天3分钟操作系统修炼秘籍(13):两个缓冲空间Kernel Buffer和IO Buffer
两个缓冲空间:kernel buffer和io buffer 先看一张图,稍后将围绕这张图展开描述.图中的fd table.open file table以及两个inode table都可以不用理解, ...
- windows中修改IP映射的位置
windows中修改IP映射的位置 置顶 2018年08月05日 14:42:44 wangxiaolong0 阅读数:1473 在安装linux之后,发现windows不能通过映射来访问linu ...
- GitHub和Git
GitHub托管项目代码 首先一些基本概念: repository(仓库) 用来存放项目代码,每个项目代表一个仓库,开一个项目就意味着你有一个仓库. star(收藏) 收藏方便下次查找. fork(复 ...
- nyoj 655-光棍的yy (python, 未A)
655-光棍的yy 内存限制:64MB 时间限制:1000ms 特判: No 通过数:4 提交数:7 难度:2 题目描述: yy经常遇见一个奇怪的事情,每当他看时间的时候总会看见11:11,这个很纠结 ...
- Python基础教程(第3版)学习笔记
第1章.基础 1.几个小知识点 多用 help() 帮助文档 除法运算 / 除法运算,得到结果为浮点数: // 整除运算,得到整数值(向下取整): % 取余操作 (结果符号与除数符号相同),本质上: ...
- 力扣(LeetCode)加一 个人题解
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入 ...
- 力扣(LeetCode)猜数字大小 个人题解
我们正在玩一个猜数字游戏. 游戏规则如下:我从 1 到 n 选择一个数字. 你需要猜我选择了哪个数字.每次你猜错了,我会告诉你这个数字是大了还是小了.你调用一个预先定义好的接口 guess(int n ...
- 领扣(LeetCode)转置矩阵 个人题解
给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7] ...
- opencv 5 图像转换(3 重映射 仿射变换 直方图均衡化)
重映射 实现重映射(remap函数) 基础示例程序:基本重映射 //---------------------------------[头文件.命名空间包含部分]------------------- ...
- IPv6,无需操作就可升级?
最近这段时间,5G 出现在你能看到的各种信息里,铺天盖地的宣传提醒着大家新一代互联网的到来.其实早在几年前 5G 就有所提及,可是为什么到现在才开始窜上热门呢?这就涉及到了 IPv6. 或许有不少朋友 ...