写点什么

Golang Map 和字符串

用户头像
escray
关注
发布于: 2021 年 04 月 16 日
Golang Map 和字符串

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

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


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


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


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


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


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

11 | Map 与工厂模式,在 Go 语言中实现 Set


对于判断某个值在 Set 中是否存在的代码做了一点小的重构:


func TestMapForset(t *testing.T) {  mySet := map[int]bool{}  mySet[1] = true  n := 3  setExisting(mySet, n)  t.Log(len(mySet)) // 1  mySet[3] = true  t.Log(len(mySet)) // 2  delete(mySet, 1)  setExisting(mySet, 3)  t.Log(len(mySet)) // 1}
func setExisting(set map[int]bool, n int) { if set[n] { fmt.Printf("%d is existing", n) } else { fmt.Printf("%d is not existing", n) }}
复制代码


有同学在留言里面提到 mySet[1]=false 会有误解,另外还有对于 set 中元素唯一性的疑惑,我觉得可能是没有理解如何使用 map 来实现 set。


其实 map 的 key 就是 set 的值 value,如果有值,那么就是 map[value] = true。


看到有同学似乎已经在留言里面问到关于网络编程(爬虫?)的问题了,我真是来的太晚了。


另外,似乎 Go 语言经过最近两年的发展,似乎要支持泛型了。

12 | 字符串


顺着留言,去阮一峰老师那边重温了一下字符集编码的内容,之前也琢磨过,但是很久不用,已经生疏了。


前两天在 Redis 里面看到了 itoa,怎么也猜不出来含义,原来答案在这里。


func TestStringHeader(t *testing.T) {  str1 := "hello world"  str2 := "hello world"  header1 := (*reflect.StringHeader)(unsafe.Pointer(&str1))  header2 := (*reflect.StringHeader)(unsafe.Pointer(&str2))  t.Log(header1.Data == header2.Data) // true  t.Log(header1 == header2) // false  t.Log(unsafe.Pointer(&str1), unsafe.Pointer(&str2)) // 0xc000096530 0xc000096540}
复制代码


有一个地方不太理解,我 rune 中文之后,输出的是一个五位数?可能是显示格式的问题


za := []rune("早安")t.Log(za) // [26089 23433]
复制代码


没有去看 strings 和 strconv 的官方文档,等以后用到的时候再查。

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

escray

关注

Let's Go 2017.11.19 加入

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

评论

发布
暂无评论
Golang Map 和字符串