ARTS
ARTS 是陈浩(网名左耳朵耗子)在极客时间专栏里发起的一个活动,目的是通过分享的方式来坚持学习。
每人每周写一个 ARTS:Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。
本周内容
本周的 ARTS你将看到:
- 成对翻转链表.
- 一文看懂分布式系统设计?
- Golang 为什么不推荐加等操作?
- 代码能力到底是什么能力?
Algorithm
本周的算法题是非常常见的一道题目: 成对翻转链表 Swap Nodes in Pairs.
如果说翻转链表是面试第一常考题目的话, 这道题应该至少是面试前三常考题了. 链表类的题都有个特点, 就是很多时候看着贼简单, 但是一旦动手开始写就很容易把自己绕晕. 所以能画图尽量先画图吧, 在自己把自己绕晕之前.
func swapPairs(head *ListNode) *ListNode {
shead := &ListNode{Next: head}
s := shead
for s.Next != nil && s.Next.Next != nil {
a, b := s.Next, s.Next.Next
s.Next, a.Next, b.Next = b, b.Next, a
s = a
}
return shead.Next
}
Review 文章推荐
本周的英文文章是 Scalable Web Architecture and Distributed Systems.
文章以一个图片网站(image hosting)为例介绍了一个 web 服务如何从单点模式扩展为一个使用分布式架构的服务. 这更像是一篇分布式系统的科普文章, 扫盲向, 没有很深入的原理和实现论证. 主要从服务拆分, 冗余服务(横向扩展), 数据分片这些方面介绍如何对服务和数据进行拆分. 然后又针对拆分后的服务和数据介绍了提升性能的一些方式, 比如怎样在系统中加入缓存, 以及如何使用代理服务(proxy), 数据索引, 负载均衡和队列.
一句话总结, 文章很基础, 但对于传统意义上的"分布式"系统架构介绍来说算是非常详细了.
Tip 编程技巧
- time.Duration 是以 nano second 为单位的 int64 类型, 如果有直接解析底层数据的地方最好考虑下这个单位问题.
- Go 中的变量 i += 1 到底有什么问题?
经常看到推荐使用 i++ 但是不推荐使用 i += 1 的说法, 但一直没找到具体的原因, 现在猜测很可能是代码风格原因而非性能.
当然如果涉及到对 map 的下标表达式进行 ++ 或者 += 1 这样的操作, map 的 kv 对中的 v 不允许取地址, 而无法进行自加操作. 当然这是另外一个问题了. - Go 中的 break 可以跳出 select, 但只会跳出最近的块.
map 不能对值类型的元素做修改? 看这里
这可能是因为通过 map[key] 得到的值不可取地址导致的.
关于 map 的实现原理可以看这里.
每个桶中的tophash是8个原因是 每一个tophash是8位,8个tophash就是64位,64位是64位机的最小寻址空间。
- sync.Map
amortized constant time(摊还常量时间) O(1).
- 字面量不能取地址, 比如这种
int(3)
直接取地址会报错&int(3)
.
Share 灵光一闪
代码能力, 可能包含的方向:
- 类似结构化思维的结构化代码编写能力, 或者通俗一点, 就是熟练运用各种设计模式, 能对架构逻辑和业务逻辑进行抽象封装或者解耦;
- 复杂逻辑的梳理能力, 能用比较清晰的代码表达一个相对复杂的逻辑, 这需要提前想好业务逻辑的关键节点, 在心里预编写或者想好处理方式;
本周阅读列表
- kafka 中的零拷贝技术
- Go语言设计与实现 Map
有疑问加站长微信联系(非本文作者)