重归基础 Link to heading
通过例子来学习Go
英文版本:https://gobyexample.com/
中文版本:https://gobyexample-cn.github.io/
笔记 Link to heading
迭代和递归 Link to heading
重新感受一下斐波那契数列的递归和迭代算法性能差距
// feb.go
func FebRecursive(n int) int {
if n == 0 {
return 0
}
if n == 1 {
return 1
}
return FebRecursive(n-1) + FebRecursive(n-2)
}
func FebIterative(n int) int {
if n == 0 {
return 0
}
a, b := 0, 1
for i := 1; i < n; i++ {
b = a + b
a = b - a
}
return b
}
// feb_test.go
func Benchmark_FebIterative(b *testing.B) {
for i := 0; i < b.N; i++ {
FebIterative(30)
}
}
func Benchmark_FebRecursive(b *testing.B) {
for i := 0; i < b.N; i++ {
FebRecursive(30)
}
}
字符串和rune Link to heading
调用 len 得到字节长度 for range 是按照rune来遍历
它从 0 开始,为每个符号指定一个编号,这叫做”码点”(code point)。比如,码点 0 的符号就是 null(表示所有二进制位都是 0)。
U+0000 = null 上式中,U+表示紧跟在后面的十六进制数是 Unicode 的码点。
这么多符号,Unicode 不是一次性定义的,而是分区定义。每个区可以存放 65536 个(2^16)字符,称为一个平面(plane)。目前,一共有 17 个平面,也就是说,整个 Unicode 字符集的大小现在是 2^21。
最前面的 65536 个字符位,称为基本平面(缩写 BMP),它的码点范围是从 0 一直到 2^16-1,写成 16 进制就是从 U+0000 到 U+FFFF。所有最常见的字符都放在这个平面,这是 Unicode 最先定义和公布的一个平面。
剩下的字符都放在辅助平面(缩写 SMP),码点范围从 U+010000 一直到 U+10FFFF。
Go 源码文件默认采用 Unicode 字符集,Unicode 码点和内存中字节序列的变换实现使用了 UTF-8
范型 Link to heading
https://segmentfault.com/a/1190000041634906
池 Link to heading
思路:协程池和多路I/O复用
实现参考: https://github.com/bytedance/gopkg/tree/develop/util/gopool
高并发场景下,使用协程池来减少协程创建的开销,减少内存分配的频率
模仿(照抄)上面的gopool实现了一个协程池:https://github.com/binc4t/wpool
主要组件:
task pool
worker pool
- 从task pool取出task,赋值一个执行func, 放入队列,这里用单向链表实现队列
- 查看task队列的task数量,超过阈值则从worker pool中取得一个worker
- worker main 循环,不断获取task并执行,如果没有task,则回收这个worker,放入worker pool