编写可维护的代码是最基本的要求。清晰度、可读性和简单性都是保持代码可维护性的各个方面。它应该使某人加入您的项目或在有人离开后维护代码的过程变得容易。可维护性的衡量指标是代码更改的容易程度以及与这些更改引起的风险性。为了有效地编写Go程序,了解Go语言的属性和地道写法,并使用与命名、程序构建、格式等相关既定约定是至关重要。
以下是一些有助于编写可维护的Go代码的良好实践。
原文: Writing maintainable Go code by Jogendra.
编写可维护的代码是最基本的要求。清晰度、可读性和简单性都是保持代码可维护性的各个方面。它应该使某人加入您的项目或在有人离开后维护代码的过程变得容易。可维护性的衡量指标是代码更改的容易程度以及与这些更改引起的风险性。为了有效地编写Go程序,了解Go语言的属性和地道写法,并使用与命名、程序构建、格式等相关既定约定是至关重要。
以下是一些有助于编写可维护的Go代码的良好实践。
原文: Writing maintainable Go code by Jogendra.
一些编程语言如C++、Rust都是支持泛型特例化的,Go泛型支持吗?
自 Go 1.18 支持泛型后, Go interface 的意义已经彻彻底底的改变了,除了先前代表的方法集的意义外,还被用作泛型的类型约束(type constraint)的功能, interface已经不再是以前那个单纯的少年了。
Go fuzzing(模糊测试)是Go 1.18发布的另一个非常重要的特性,因为Go泛型已经把大家的目光都吸引过去了,导致go fuzzing这个特性有些人还不是太了解。Go官方发布了一个文档,介绍了Go Fuzzing技术。
Go Fuzzing
根据Go 泛型提案的描述,Go不支持泛型方法:No parameterized methods。主要原因Go泛型的处理是在编译的时候实现的,泛型方法在编译的时候,如果没有上下文的分析推断,很难判断泛型方案该如何实例化,甚至判断不了,导致目前(Go 1.18)Go实现中不支持泛型方案。
不过,泛型方法的缺失,多多少少给程序员带来一丝丝的忧伤的情绪,在一些场景之下,使用起来特别不方便。我最近看到了几个因为缺乏泛型方法导致的问题,在本文中总结一下,和大家探讨。
有一点点让人欣慰的是,Ian Lance Taylor和Ian Lance Taylor并没有把话说绝,说不定在某个版本中,泛型方法又支持了:
So while parameterized methods seem clearly useful at first glance, we would have to decide what they mean and how to implement that.
去年的时候我写了一篇Go并发编程一年回顾,如今2021年也快结束了,Go 1.18的特性已经冻结,美国页很快进入了假期模式,趁这个节点,我们回顾一下近一年Go并发编程的进展。
原文: Faster time parsing, 可以学习一下作者优化程序的方法。
Go标准库中有一些单例的实现,比如log
包中默认的Logger
、net.DefaultResolver
, 这些对象提供了便利的方法,但是有的时候,我们需要做一些定制话的功能,需要更改这些对象,
甚至有的时候,我们需要更改标准库的特定方法,常规手段是不起作用的, 必须使用一些"骇客"的方式。
国庆北京连绵秋雨,整好我窝在家里,实现了一个原本想12月份实现的产品,在开发项目的过程中,也遇到了一些需要更改标准库默认行为的需求,所以在这方面做了一些探索,整理出这篇文章,以飨读者。
Go 1.17中你就可以使用泛型了,可以参考我3月份的文章:Go 泛型尝鲜, 编译的时候需要加-gcflags=-G=3
参数,而当前master分支,默认已经支持泛型,不需要加-G=3
参数了。
你可以通过下面的步骤尝试go最新分支:
|
|
编译代码的时候使用gotip
替换go
命令即可。
随着Go 1.17的发布,最近也涌现了很多的介绍Go泛型的文章,基本上都是简单介绍的文章。
最近Go泛型的变化是增加了两个操作符: ~
和|
:
~T
restricts to all types whose underlying type is T: 代表底层类型是T
T1 | T2 | ...
restricts to any of the listed elements: 代表或
,类型列表之一。这些不是我想介绍的内容,今天我肝一篇介绍Go泛型实现原理的文章,介绍Go泛型实现的方案。
对于一个函数func Echo[T any](t T){}
,Go编译器到底编译成了什么代码?
简单的说,当前Go泛型实现的方案和下图中的方案一样: