本周开始,绝大多数人的工作与生活步入了常规模式。
希望大家的身体与心理都能尽快地适应工作或学习节奏,保持一颗愉悦的心情。
Go技巧 - 浅谈1.20版本特性
本周Go
语言1.20版本正式发布,我们对其重要特性进行简单分析,为后续掌握Go
的发展脉络做好铺垫。
切片转数组
在1.17版本时,切换转数组的语法已经支持,只是写起来比较冗余。在这次1.20版本进行了优化:
1 | var x []byte |
这个语法本身没有太多的学习成本,但官方在此时才完全支持,这就导致:在1.17版本前的绝大多数开发场景下,Go
开发者都更愿意用更灵活的切片来代替数组。但相较于切片,固定长度的数组对节约内存更为友好。
而随着1.20版本的推出,使用数组的语法便利性大幅提高,相信会有更多追求极致性能的人开始引入数组。
unsafe三个新函数
unsafe中提供了三个新函数:SliceData
、String
和StringData
。
这三个函数是低频使用的,我们按需阅读官方文档即可。如果你对指针的相关知识基础扎实,很容易理解这三个函数。
时间常量的定义
终于,在1.20版本引入了开发者最常用的时间戳格式:
1 | const DateTime = "2006-01-02 15:04:05" |
经历了多少次手写时间,查找了多少个相关的低级bug,官方终于把这个时间格式放到了标准库中。强烈建议升级到1.20版本的项目,先做一次变量的全局替换。
这里分享一个小tip:如何记忆这个时间戳?记住1~6:
- 1月
- 2日
- 下午3点
- 4分
- 5秒
- 06年
error的组合
标准库中的error
支持了组合的能力,扩展了错误的使用场景。
例如,程序发生了错误,从开发者来看,既有属于数据库的错误A,又有属于业务逻辑的错误B。在上层用errors.Is
判定时,只能在A与B中二选一。而1.20则引入了Join
类型,则可以将两个错误组合起来,上层判断时两个都成立。
1 | var errA error |
其它
- 更新结构体比较的规范的说明(严格来说是修正了不严谨的说明,代码已经实现)
- 泛型类型对
Comparable
更多的支持 Go
后续支持各操作系统的计划- 相关工具链的优化
- 编译速度提升,达到差不多引入泛型前的水平
- 运行时提升CPU效率约2%
小结
从近几个版本的迭代来看,Go
官方一直关注前后版本兼容性,这对开发者来说体验是很棒的。官方把主要精力花在了两个方面:
- 相关工具与库的建设,完善基本开发的生态
- 底层能力(如编译)的建设
可见,Go
团队通过前期的设计,帮助我们屏蔽了下层的细节,是一个很棒的编程体验。
编程思考 - 对成长来说,划分边界是为了扩大边界
在编程开发中,有许多划分边界的事情,如:
- 代码的模块划分
- 微服务的划分
- 业务领域的划分
- 网络的分层
划分边界后就有了分工,优秀的分工协作可以带来组织效率的提升。但是,随着日复一日的重复性工作,很容易就只专注于自己职责范围内的部分,而忽略了相关方。近几年,许多公司倡导的 “跳出当前角色”、“共赢思想”、“FT-Feature Team” 等词汇,都是一种跨出当前工作内容、与周边其余组织团队合作的思想。
我们要从更高的视角来理解: 划分边界是为了整体实现更高价值的一种方法,而不是成为一种阻碍。所以,我们要不断地跨出当前职责,比如:
- 了解某个模块的依赖方 - 如学习ORM库时,顺便了解一下数据库的基本知识
- 主动了解周边服务 - 如做支付系统时,了解订单系统的设计与交互
从许多大厂的职级定义来看,职级的提升往往就是边界的扩大 - 从单个服务、一个系统、整套业务,最后甚至要有跳出技术的视角。
工作生活 - 学习一些营养学知识
最近看了《你是你吃出来的》和《你是你吃出来的2》两本书。书的内容涉及到许多健康、医学相关的内容,作者的文笔已经很通俗易懂了,有兴趣的朋友可以自己去看看。
对书中的例子要保持理性:
比如某患者听了作者的说法,换了食谱,三个月后就恢复了。但是,三个月内其余因素是否有变化?比如吃了药、加强锻炼、心态变化等。
读完本书,我有个观点一直萦绕心头:高血压、糖尿病等这种亚健康的情况,是很难定义边界的。虽然业内有参考值,但很容易因人种、环境等因素而变化,颇为个性化。而我们称它们为“病”,往往是已经严重到远超临界值了。对于这些情况,吃药就像是亡羊补牢 - 虽然有效果,但很难根治。我相信,大众更需要的是营养学知识的普及。
目前,绝大多数人很难有专属的家庭医生,这就要求每个人都拥有基础的营养学知识储备。相关的理论知识已经很完善了,但当前社会缺少一个权威的宣传路径,把这块知识普及到大众。
个人觉得像公众号、抖音视频等,由于整个传播路径上干扰信息过多,但很难具有公众说服力。而类似于 国家反诈中心 这种独立app更具有权威效应。
Github: https://github.com/Junedayday/code_reading
Blog: http://junes.tech/
Bilibili: https://space.bilibili.com/293775192
公众号: golangcoding