infoq的arts打卡学习,贯彻左耳朵耗子的学习理念,活到老学到老,每天都精进一点,上个星期没有写打卡文档,只能用工作太忙为借口为自己开脱了
最近工作使用算法场景较少,基本上是基于数据统计对系统进行优化,因此结合工作的算法暂时没有,最近在学习go,就用go来写一些经典算法吧,再配上单元测试,加深对go的理解
二分查找法go的实现,接收两个参数:有序数组arr和待查找的值target。通过循环迭代的方式,在每次迭代中更新查找范围的起点和终点,直到找到待查找的值或者确认查找范围为空。若找到待查找的值,则返回它在数组中的索引位置;若未找到,则返回-1。
// 冒泡排序法
func AscSort(arr []int) []int {
maxInter := len(arr) - 1
for i := 0; i < maxInter; i++ {
for j := maxInter; j > i; j-- {
if arr[j-1] > arr[j] {
temp := arr[j]
arr[j] = arr[j-1]
arr[j-1] = temp
}
}
}
return arr
}
单元测试
func TestAscSort(t *testing.T) {
Convey("冒泡排序", t, func() {
// 排好序的情况
arr := []int{1,3,4,5,7,9,10}
res := AscSort(arr)
So(res, ShouldResemble, arr)
// 乱序
arr1 := []int{7,1,5,3,9,4,10}
res = AscSort(arr1)
So(res, ShouldResemble, arr)
// 逆序
arr2 := []int{10,9,7,5,4,3,1}
res = AscSort(arr2)
So(res, ShouldResemble, arr)
})
}
英语单词,推荐使用「摸鱼单词」,每天早到公司15分钟,开启「摸鱼单词」记忆单词熟悉发音
英语每日一读, 微信公众号 - 「夏说英文晨读」或「友邻优课app」,最近时事,每天一遍,跟读录音review,感觉挺好
在高并发场景下,使用go取代php,在实现上有更多的思路(方案)提升性能。提升性能的本质之一是减少io
场景: 寻址系统 - 在一堆服务器中为设备选出最优(连接数最少、负载最低)一台,让设备与服务器保持长连接。
现状:初始时,已经将php代码优化到了极致,但一次寻址仍然存在20次io,主要是和redis的交互,而存储在redis中的信息配置数据几乎不怎么修改。
优化:使用php已经无法再优化;
1、go使用etcd做配置中心,将改动频率低的数据写入到etcd中,有变更时实时更新到程序内存中。
2、当前php限流依赖于redis中滞后的redis、mongo的操作数和连接数,存在redis io,改用go sentinal,没有io,并且限流及时,不会滞后,更好地保护下游服务。
知识不是一成不变的真理。
知识不是对现实的客观纯粹反映,是人们对事物的解释、假说和假设,随着人们对事物的认识程度的深入而不断变革、深化,出现新的解释和假说。
比如地心说和日心说,我们现在看知道这两种说法都是错误的。但地心说提出的时候,人们都认可地心说,随着人们对事物认识程度的深入,阿利斯塔克、哥白尼又提出了日心说,日心说经过300多年的发展,随着开普勒、伽利略和牛顿工作的进展,特别是恒星光行差和视差的发现,终于否定了地心说和日心说,提出了大爆炸说。天文学的发展表明,太阳仅仅是一个普通恒星,它并不在宇宙的中心。