GO入门——4. 数组、切片与map
1. 数组
- 定义数组的格式:var [n],n>=0
- 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型
- 注意区分指向数组的指针和指针数组
//数组的指针
a := [2]int{1, 2}
p := &a
fmt.Println(p) //&[1 2]
//指针数组
x, y := 1, 2
b := [2]*int{&x, &y} //[0xc042034208 0xc042034220]
fmt.Println(b)
- 数组在Go中为值类型
- 数组之间可以使用==或!=进行比较,但不可以使用<或>
- 可以使用new来创建数组,此方法返回一个指向数组的指针
- Go支持多维数组
a := [2][3]int{
{1, 2, 3},
{4, 5, 6}} //最后的}必须在这一行
fmt.Println(a) //[[1 2 3] [4 5 6]]
//长度不同的数组类型不同
var a [2]int
var b [1]int
// a = b 编译错误:cannot use b (type [1]int) as type [2]int in assignment
//直接赋值
c := [2]int{1} //第一个为1,第二个默认为0
d := [20]int{10: 1, 19: 2} //指定固定位置的值
//系统推断类型(长度)
e := [...]int{1, 2, 3}
f := [...]int{1, 2, 3, 19: -1}
//通过new创建指向数组的指针,都可以通过[]来获取和设置数组元素
p1 := new([2]int)
p1[1] = 1
fmt.Println(p1) //&[0 1]
p2 := [2]int{}
p2[1] = 1 //[0 1]
fmt.Println(p2)
2. 切片
其本身并不是数组,它指向底层的数组
作为变长数组的替代方案,可以关联底层数组的局部或全部
为引用类型可以直接创建或从底层数组获取生成
使用len()获取元素个数,cap()获取容量
一般使用make()创建
如果多个slice指向相同底层数组,其中一个的值改变会影响全部
make([]T, len, cap)
其中cap可以省略,则和len的值相同
len表示存数的元素个数,cap表示容量
2.1 reslice
- Reslice时索引以被slice的切片为准
- 索引不可以超过被slice的切片的容量cap()值
- 索引越界不会导致底层数组的重新分配而是引发错误
2.2 append
- 可以在slice尾部追加元素
- 可以将一个slice追加在另一个slice尾部
- 如果最终长度未超过追加到slice的容量则返回原始slice
- 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
//数组
a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
//slice
var s []int
//取从[5,len(a))的值放入slice
s = a[5:]
fmt.Println(s) //[6 7 8 9 0]
s[1] = 10 //slice是共享数组的,因此修改slice数组也会修改
fmt.Println(s) //[6 10 8 9 0]
fmt.Println(a) //[1 2 3 4 5 6 10 8 9 0]
//make的三个参数表示类型、len和cap
//当长度超过cap时,该slice的cap将乘以2将内存换一个位置,并将原始数据复制过去
ss := make([]int, 2, 3)
for i := 0; i < 10; i++ {
s1 := append(ss, i) //append的返回值需要注意,当赋值给新的slice时,ss将永远不会改变
fmt.Println(len(ss), cap(ss), ss)
fmt.Println(len(s1), cap(s1), s1)
}
//当slice重新分配内存后,对其值的修改不会影响到之前共享的数组
s2 := a[:2]
fmt.Println(s2)
s2 = append(s2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3)
s2[0] = 100
fmt.Println(a) //[1 2 3 4 5 6 10 8 9 0]
//copy,当长的复制到短的时只复制短的个数,当短的复制到长的时将短的完全复制到长的中
s3 := []int{1, 2, 3, 4, 5, 6}
s4 := []int{7, 8, 9}
copy(s3, s4) //将s4复制到s3
fmt.Println(s3) //[7 8 9 4 5 6]
s3 = []int{1, 2, 3, 4, 5, 6}
copy(s4, s3)
fmt.Println(s4) //[1 2 3]
3 map
类似其它语言中的哈希表或者字典,以key-value形式存储数据
Key必须是支持==或!=比较运算的类型,不可以是函数、map或slice
Map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍
Map使用make()创建,支持 := 这种简写方式
make([keyType]valueType, cap),cap表示容量,可省略
超出容量时会自动扩容,但尽量提供一个合理的初始值
使用len()获取元素个数
键值对不存在时自动添加,使用delete()删除某键值对
使用 for range 对map和slice进行迭代操作
//声明与赋值,[]中为key类型,其后为value
var m map[string]int
m = map[string]int{}
//通过make创建与声明
var m1 = make(map[int]string)
m2 := make(map[int]string)
//对k-v取值与设值
m1[1] = "ok"
fmt.Println(m1[1]) //ok
delete(m1, 1) //删除key
fmt.Println(m1[1]) //空
//多返回
a, ok := m1[2]
if !ok {
fmt.Println("没有key=2的value") //输出
}
fmt.Println(a, ok) //当不存在key时会返回空,ok=false
//复杂map
var mf map[int]map[string]int
mf = make(map[int]map[string]int) //初始化最外层map
mf[1] = make(map[string]int) //初始化map[1]中的map,仅仅初始化key=1的map
mf[1]["ok"] = 3
fmt.Println(mf[1]["ok"])
4 range
//对于slice,i,v分别为index和slice下标对应的值,可以采用_将值忽略
s := []int{1, 2, 3}
for i, v := range s {
fmt.Println(i, v)
v = 10 //i,v为值的拷贝,修改不影响slice
s[i] = 0 //直接修改了slice
}
fmt.Println(s) //输出[0 0 0]
//对于map,k,v即为map中的key,value
//每次range的顺序可能不一样
m := map[int]string{
1: "ok"}
for k, v := range m {
fmt.Println(v)
m[k] = "okok" //修改map中值也只能通过对m进行直接操作
}
fmt.Println(m) //map[1:okok]
GO入门——4. 数组、切片与map的更多相关文章
- 四、golang内置函数、递归、闭包、数组切片和map
一.总体内容 1.内置函数.递归函数.闭包 2.数组和切片 3.map数据结构 4.package介绍 一.内置函数 注意:值类型用new来分配内存,引用类型用make来分配内存 1.close:主要 ...
- go:内置函数 | 闭包 | 数组 | 切片 | 排序 | map | 锁
内置函数 1.close: 主要是用来关闭channel 2.len:用来求长度,比如string.array.slice.map.channel 3.new与make都是用来分配内存 new用来分配 ...
- Go语言类型(布尔、整型、数组、切片、map等)
1.基本类型 布尔类型:bool 注意:布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换. 整型:int8.byte(uint8).int16.int.uint.uintptr int.ui ...
- Go语言学习之4 递归&闭包&数组切片&map&锁
主要内容: 1. 内置函数.递归函数.闭包2. 数组与切片3. map数据结构4. package介绍 5. 排序相关 1. 内置函数.递归函数.闭包 1)内置函数 (1). close:主要用来关闭 ...
- go语言之行--数组、切片、map
一.内置函数 append :追加元素到slice里,返回修改后的slice close :关闭channel delete :从map中删除key对应的value panic : 用于异常处理,停 ...
- 窥探Swift之数组安全索引与数组切片
今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...
- golang中不定参数与数组切片的区别
package main import "fmt" func main() { myfunc1(, , , ) //传递不定数量的参数 myfunc2([], , , }) //传 ...
- go语言 类型:数组切片
初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针.数组切片的数据结构可以抽象为以下3个变量: 1.一个指向原生数组的指针: 2.数组切片中的元素个数: 3.数组切 ...
- Swift语法基础入门二(数组, 字典, 字符串)
Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...
- go语言中的数组切片:特立独行的可变数组
go语言中的数组切片:特立独行的可变数组 初看go语言中的slice,觉得是可变数组的一种很不错的实现,直接在语言语法的层面支持,操作方面比起java中的ArrayList方便了许多.但是在使用了一段 ...
随机推荐
- Linux中的sleep、usleep、nanosleep、poll和select
在进行Linux C/C++编程时,可调用的sleep函数有好多个,那么究竟应当调用哪一个了?下表列出了这几个函数间的异同点,可作为参考: 性质 精准度 线程安全 信号安全 sleep libc库函数 ...
- BUG 图片元素img下 高度超出 出现多余空白
BUG 图片元素img下 高度超出 出现多余空白 1.将图片转换为块级对象 即,设置img为“display:block;”. 2.设置图片的垂直对齐方式 即设置图片的vertical-align ...
- Hdu3829 Cat VS Dog(最大独立点集)
Cat VS Dog Problem Description The zoo have N cats and M dogs, today there are P children visiting t ...
- 14.combobox自动搜索
前台页面: 后台查询:
- 常见CEPH操作命令
1. rbd ls 查看ceph默认资源池rbd里面的镜像2. rbd info xxx.img 查看xxx.img的具体的具体信息3. rbd rm xxx.img 删除xxx.img4. rbd ...
- title
事实上 @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import ur ...
- ubuntu18.10安装redis遇到问题
执行命令apt-get install redis-server 安装遇到的问题 1.出现apt-get被占用情况,用ps -a|grep apt ,杀死存在的apt进程 2.还不行就执行sudo f ...
- sam(后缀自动机)
后缀自动机ins解释 void ins(int c){ int p=last;//将当前节点的parent节点变为last int np=++cnt;//建立新节点 last=np;//将last设为 ...
- 输入URL地址到最终页面渲染完成,发生了什么事
1. 域名DNS解析 - 浏览器DNS缓存 - 系统DNS缓存 - 路由器DNS缓存 - 网络运营商DNS缓存 - 递归搜索...... 2. TCP连接: TCP三次握手 - 第一次握手,由浏览器发 ...
- eslint 配置及规则说明
中文官方网站 安装 可以全局安装,也可以在项目下面安装. 如下是在项目中安装示例,只需要在 package.json 中添加如下配置,并进行安装: “eslint”: “^4.11.0” 配置 配置方 ...