Reverse Range Based For Loops
实现
1 | template<typename T> |
1 | template<typename T> |
有时候我们希望用更明确的自定义类型取代一些 primitives,依靠类型系统来减少一些人为错误:
1 | void Run(WithMultithreading mt, WithAdvancedMode advanced); |
类型 WithMultithraeding
和 WithAdvancedMode
用起来很像 bool
,但是他们是两个不同的类型,混用会出现编译错误。
1 | Run(mode, mt); // compile failure; type mis-match |
不管我们使用 typedef
还是 using
,都只能定义 bool
的类型别名;在类型系统看来他们还是一回事。
最近看了这篇文章有一种顿悟感,想着写点总结加深理解。
如果嫌原文太长可以直接看这篇总结;不过别人咀嚼过的不一定适合你,所以还是推荐一块把原文也看了😁。
假设一个函数 foo()
中的某个操作发生了错误,并且后续操作直接或间接地依赖当前操作的正确行为;那么,不管使用何种错误处理/汇报手段,这里都需要 (1) 中止后续操作并 (2) 向上汇报错误。
这里称这种行为为 operation cancellation。
昨晚抽了个时间想修一下 anvil 的这个 issue。
根据之前的代码实现,我有 99.99% 的把握换行符被替换成 CRLF
是使用了 fileinput
原地修改了文件导致的。
那段修改的代码的一个等价实现如下:
1 | import shutil |
orig.txt
是一个模板文件,它会被拷贝到指定目录变成一个新文件 new.txt
,并修改文件内容。
通过连接池的设计了解如何回收连接到连接池以及从连接池复用连接后,可以回过头来研究一下 Redigo 支持的阻塞等待可用连接的设计与实现。
通过设置 Pool.Wait == true
之后如果当前连接池满了, Pool.Get()
不会返回连接池耗尽错误,而是阻塞在调用上,直到超时或者存在可用连接才会返回。
这个属于经典的 resource counting 问题,并且最大的 resource count 由 Pool.MaxActive
决定。
暴露给外部用户的 Pool
对象
1 | type Pool struct { |
内部维护空闲/待复用的列表数据结构 idleList