【翻译】Go 编译器理解: 新增一个关键字语句-Part2

这是介绍Go编译器系列的第二篇,在第1部分中,我们在Go中添加了一个新的关键词语句,通过构建修改版本的编译器来支持该关键字。为此,我们按照此图介绍了编译器的前五个阶段:

在最后,我们是通过在"重写AST"阶段将其替换为for来实现until。另外,在gc/walk.go中,其他类似的转换也是在编译器进行SSA转换和代码生成之前完成的。

在这一部分中,我们将通过在编译流程中处理新的until语句来介绍编译器的其余阶段。

【翻译】Go 编译器理解: 新增一个关键字语句-Part 1

原文发表在 thegreenplace,推荐观看原文Go compiler internals: adding a new statement to Go - Part 1 - Eli Bendersky’s website (thegreenplace.net)

这是该系列第一篇文章,文章将简单介绍Go 的编译器。编译器知识非常庞大,一般需要一本书才能详细描述。因此本文章只是一个快速的叫深入的介绍。我计划未来写更多的关于编译器的文章。

在本系列中,我们将向Go编译器中添加一个新的语言关键字,建立一个可修改的编译器。(译者注:Go实现了自举,因此Go编译器也其实是一个Go应用,只要理解其中的原理,添加一个新的关键字特性也并非难事)

一个介于wait-free 和 lock-free的高性能MPSC队列

本文实现了一个介于wait-free 和 lock-free的高性能MPSC队列,也就是多生产者但消费者队列。

与使用channel耗时测试:
测试配置:1W个生产者,每个生产者写入90次。统计生产者全部写入队列耗时。

测试 MPSC队列耗时 channel耗时
测试1 115.454185ms 965.9469ms
测试2 97.00209ms 992.595ms
测试3 109.776455ms 989.837ms
测试4 90.19232ms 1.3611857s
测试5 79.12408ms 1.2725355s
测试6 68.650755ms 1.3981461s
测试7 77.155775ms 1.2469043s
测试8 103.899735ms 1.4227174s
测试9 72.15339ms 1.3351006s
测试10 129.974485ms 1.0454128s

Go nil详解

Go 类型的默认值

基本类型(basic type)

  • 内置字符串类型:string.
  • 内置布尔类型:bool.
  • 内置数值类型:
    • int8uint8byte)、int16uint16int32rune)、uint32int64uint64intuintuintptr
    • float32float64
    • complex64complex128

注意,byteuint8的一个内置别名,runeint32的一个内置别名。

Go 实际项目测试实践

测试的重要性不言而喻。然而在项目中,真正做到编写完整的测试却是少之又少。

主要原因推测有三个:

  • 觉得写测试太麻烦,花费时间。其实我觉得这是个伪命题,因为通常写完一段代码,我们肯定会测试该代码能否正确执行,比如HTTP请求,数据库请求,RPC请求,逻辑函数。我们都会进行访问测试,这其实就是测试用例了,只是没有集成到测试框架中。其实,我们完全可以将这部分测试写成代码放到测试中。
  • 代码不可测试。这其实很常见,大部分我们都是接手已有的代码。如果代码没有好的架构设计,统一的分格,强制的CR。那么写出不可测试的代码也就司空见惯了。对于这种代码,只能进行逐步重构了。
  • 不知道怎么测试。项目中的代码一般都会有很多的依赖,而测试中去独立部署这些服务肯定成本巨大,因此如何处理这些依赖是建立测试的最大障碍。下文中我也会尝试介绍这部分的处理手段。

一般的测试分为单元测试和集成测试,但是这里我们会模糊这种界限,不做具体区分。下面出现的代码都是为了这篇文章而写的伪代码,没有考虑架构之类的。

[翻译]Real-world SQL in Go: PartI

原文由 Ben Johnson 发表在 gobeyond,推荐观看原文文章链接

不管您是不是讨厌还是接受SQL,在某个时候您都会在项目中使用它。关系数据库结构并不总是能很好地映射到应用程序数据结构,但SQL的普遍性意味着它是开发人员在需要数据持久性时使用的基本工具。

虽然Go有GORM之类的对象关系映射库,但我们将避免这种集成库,而直接使用标准库包database/sql。ORM库封装了SQL底层的复杂性,在简单的数据访问中这很有帮助,但缺点是会使高级查询和调试更加复杂。

在本文中,我们将研究如何直接使用SQL构造数据访问代码、在何处处理业务模型以及一些有用的SQL技巧。我将引用WTF Dial项目的代码。你可以通过这篇介绍性的博客文章来了解它。

[翻译]Packages as layers, not groups

原文由 Ben Johnson 发表在 gobeyond,推荐观看原文文章链接

四年前,我写了一篇名为”Standard Package Layout“的文章,试图解决即使是高级Go开发人员最困难的主题之一:package layout(go项目中包的组织)。 但是,大多数开发人员仍在努力用目录的方式组织管理代码。

几乎所有的编程语言都有一种将相关功能分组在一起的机制。 Ruby有gems,Java有packages。 这些语言没有将代码代码分组的标准约定,因为老实说,这并不重要。 一切都取决于个人喜好。

但是,转到Go的开发人员发现他们需要经常关心代码包的组织。 为什么Go软件包与其他语言如此不同? 这是因为它们不是groups(组),而是layers(层)。

[翻译]Common CRUD Design in Go

原文由 Ben Johnson 发表在 gobeyond,推荐观看原文文章链接

增删改查(CRUD)是一个技术产品的基础部分,做过应用开发的人应该很熟悉它。

开发CRUD应用时,大多数编程语言会有框架提供一个固定的开发架构,例如PHP的Yii2、Java的SSH。但是总所周知Go社区是反框架的。因此,我们需要设计自己的CRUD架构。

在一年的Go应用开发经验后,我发现了一套通用的CRUD设计模式,能满足大多数不同的项目的要求。我将以开发 WTF Dial 项目为例进行说明。 项目的详细介绍参考链接

译者:WTF Dial(which they feel) 项目提供一个界面,每个成员可输入对当前团队的糟糕程度(f-cked)。

not found!