编写可维护的Go代码

编写可维护的代码是最基本的要求。清晰度、可读性和简单性都是保持代码可维护性的各个方面。它应该使某人加入您的项目或在有人离开后维护代码的过程变得容易。可维护性的衡量指标是代码更改的容易程度以及与这些更改引起的风险性。为了有效地编写Go程序,了解Go语言的属性和地道写法,并使用与命名、程序构建、格式等相关既定约定是至关重要。

以下是一些有助于编写可维护的Go代码的良好实践。

原文: Writing maintainable Go code by Jogendra.

阅读全文

[译] go fuzzing

Go fuzzing(模糊测试)是Go 1.18发布的另一个非常重要的特性,因为Go泛型已经把大家的目光都吸引过去了,导致go fuzzing这个特性有些人还不是太了解。Go官方发布了一个文档,介绍了Go Fuzzing技术。
Go Fuzzing

阅读全文

Go泛型不支持泛型方法,这是一个悲伤的故事

根据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标准库的实现

Go标准库中有一些单例的实现,比如log包中默认的Loggernet.DefaultResolver, 这些对象提供了便利的方法,但是有的时候,我们需要做一些定制话的功能,需要更改这些对象,
甚至有的时候,我们需要更改标准库的特定方法,常规手段是不起作用的, 必须使用一些"骇客"的方式。

国庆北京连绵秋雨,整好我窝在家里,实现了一个原本想12月份实现的产品,在开发项目的过程中,也遇到了一些需要更改标准库默认行为的需求,所以在这方面做了一些探索,整理出这篇文章,以飨读者。

阅读全文

Go泛型是怎么实现的?

Go 1.17中你就可以使用泛型了,可以参考我3月份的文章:Go 泛型尝鲜, 编译的时候需要加-gcflags=-G=3参数,而当前master分支,默认已经支持泛型,不需要加-G=3参数了。

你可以通过下面的步骤尝试go最新分支:

1
2
go get golang.org/dl/gotip
gotip download

编译代码的时候使用gotip替换go命令即可。

随着Go 1.17的发布,最近也涌现了很多的介绍Go泛型的文章,基本上都是简单介绍的文章。

最近Go泛型的变化是增加了两个操作符: ~|

  • an approximation element ~T restricts to all types whose underlying type is T: 代表底层类型是T
  • a union element T1 | T2 | ... restricts to any of the listed elements: 代表,类型列表之一。

这些不是我想介绍的内容,今天我肝一篇介绍Go泛型实现原理的文章,介绍Go泛型实现的方案。

对于一个函数func Echo[T any](t T){},Go编译器到底编译成了什么代码?

简单的说,当前Go泛型实现的方案和下图中的方案一样:

阅读全文