写点什么

Golang Slice 数组和切片

用户头像
escray
关注
发布于: 2021 年 04 月 15 日
Golang Slice 数组和切片

极客时间《Go 语言从入门到实践》学习笔记 03

07 | 运算符


@碧雪天虹 同学给出的关于 &^ 的解释似乎更加容易理解。


08 | 条件和循环


其实我挺喜欢 Go 语言里面只有 for 一种循环关键字,这样就不用想太多,但是没有 foreach 有点可惜。


能感觉到 Go 的语法似乎是吸取了目前现有各种语言的优点,其中当然是有一些取舍和平衡,但是考虑到创建者的资历,我这样的小白只能学习,不能质疑。


09 | 数组和切片


数组截取部分的语法很想 Python 和 Ruby 的,应该是吸取了众家之长。


不支持负数索引略有遗憾(有同学在留言里面给出了解决方案),不过从减少程序员认知负担的角度来说,也没什么不好的。


数组 vs. 切⽚


数组容量不可伸缩;切片可伸缩,cap ×2 相同维数相同长度的数组可以比较,其中的元素全部相同则相等;


看了 @忽然之间 的留言,slice 的 cap 增长规则为:


// $GOROOT/src/runtime/slice.go// growslice functionif old.len <  1024 {  newcap = doublecap} else {  for 0 < newcap && newcap < cap {    newcap += newcap / 4  }}
复制代码


talk is cheap, show me code


从  @文西 的留言里面,还发现了一个自己的误解,我之前以为 slice 的 cap 是按照 1、2、4、8……1024、1280、1696……这样增长的,但是后来发现,在 1024 之前其实并不完全是按照 2 的幂来增长,也会有 5、10、20……这样的情况


另外,@Vincent 提到,多维数组只有第一维可以使用 "[...]"


@Geek_e634f0 提到,数组截取之后变成 slice


这节课的视频要比之前的长一些,留言也多,留言中的宝藏也不少。


10 | Map 声明、元素访问及遍历


在访问的 Key 不存在时,返回的是 Map 中 Value 类型的默认值,如果是 int ,就是 0;如果是 String ,就是空字符串 ""。


看多了 make 函数,感觉像是在看 C 语言的 malloc


Map 底层使用 Hash 表来存储,无序。


参考 @碧雪天虹  的代码,实现了一下按 key 排序,其实按照 value 排序也没有问题。


看到了其他留言里面对 value 排序的代码,感觉略显繁琐,应该有更好的办法。不知道 go 语言的 map 类型有没有类似于 findByValue 类的操作。

发布于: 2021 年 04 月 15 日阅读数: 16
用户头像

escray

关注

Let's Go 2017.11.19 加入

Let's Go,用 100 天的时间从入门到入职

评论

发布
暂无评论
Golang Slice 数组和切片