本文是全系列中第61 / 62篇:Go语言高级编程
- Go语言高级编程-序言致谢
- Go语言高级编程-Advanced Go Programming
- Go语言高级编程-第 1 章 语言基础
- Go语言高级编程-1.1 Go 语言创世纪
- Go语言高级编程-1.2 Hello, World 的革命
- Go语言高级编程-1.3 数组、字符串和切片
- Go语言高级编程-1.4 函数、方法和接口
- Go语言高级编程-1.5 面向并发的内存模型
- Go语言高级编程-1.6 常见的并发模式
- Go语言高级编程-1.7 错误和异常
- Go语言高级编程-第 2 章 CGO 编程
- Go语言高级编程-2.1 快速入门
- Go语言高级编程-2.2 CGO 基础
- Go语言高级编程-2.3 类型转换
- Go语言高级编程-2.4 函数调用
- Go语言高级编程-2.5 内部机制
- Go语言高级编程-2.6 实战: 封装 qsort
- Go语言高级编程-2.7 CGO 内存模型
- Go语言高级编程-2.8 C++ 类包装
- Go语言高级编程-2.9 静态库和动态库
- Go语言高级编程-2.10 编译和链接参数
- Go语言高级编程-第 3 章 Go 汇编语言
- Go语言高级编程-3.1 快速入门
- Go语言高级编程-3.2 计算机结构
- Go语言高级编程-3.3 常量和全局变量
- Go语言高级编程-3.4 函数
- Go语言高级编程-3.5 控制流
- Go语言高级编程-3.6 再论函数
- Go语言高级编程-3.7 汇编语言的威力
- Go语言高级编程-3.8 例子:Goroutine ID
- Go语言高级编程-3.9 Delve 调试器
- Go语言高级编程-第 4 章 RPC 和 Protobuf
- Go语言高级编程-4.1 RPC 入门
- Go语言高级编程-4.2 Protobuf
- Go语言高级编程-4.3 玩转 RPC
- Go语言高级编程-4.4 gRPC 入门
- Go语言高级编程-4.5 gRPC 进阶
- Go语言高级编程-4.6 gRPC 和 Protobuf 扩展
- Go语言高级编程-4.7 pbgo: 基于 Protobuf 的框架
- Go语言高级编程-4.8 grpcurl 工具
- Go语言高级编程-第 5 章 go 和 Web
- Go语言高级编程-5.1 Web 开发简介
- Go语言高级编程-5.2 router 请求路由
- Go语言高级编程-5.3 中间件
- Go语言高级编程-5.4 validator 请求校验
- Go语言高级编程-5.5 Database 和数据库打交道
- Go语言高级编程-5.6 Ratelimit 服务流量限制
- Go语言高级编程-5.7 layout 常见大型 Web 项目分层
- Go语言高级编程-5.8 接口和表驱动开发
- Go语言高级编程-5.9 灰度发布和 A/B test
- Go语言高级编程-5.10 补充说明
- Go语言高级编程-第 6 章 分布式系统
- Go语言高级编程-6.1 分布式 id 生成器
- Go语言高级编程-6.2 分布式锁
- Go语言高级编程-6.3 延时任务系统
- Go语言高级编程-6.4 分布式搜索引擎
- Go语言高级编程-6.5 负载均衡
- Go语言高级编程-6.6 分布式配置管理
- Go语言高级编程-6.7 分布式爬虫
- Go语言高级编程-6.8 补充说明
- Go语言高级编程-附录B:有趣的代码片段
- Go语言高级编程-附录A:Go语言常见坑
这里收集一些比较有意思的Go程序片段。
自重写程序
UNIX/Go语言之父 Ken Thompson 在1983年的图灵奖演讲 Reflections on Trusting Trust 就给出了一个C语言的自重写程序。
最短的C语言自重写程序是 Vlad Taeerov 和 Rashit Fakhreyev 的版本:
main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}
下面的Go语言版本自重写程序是 rsc 提供的:
/* Go quine */
package main
import "fmt"
func main() {
fmt.Printf("%s%c%s%cn", q, 0x60, q, 0x60)
}
var q = `/* Go quine */
package main
import "fmt"
func main() {
fmt.Printf("%s%c%s%cn", q, 0x60, q, 0x60)
}
var q = `
在 golang-nuts 中还有很多版本:
package main;func main(){c:="package main;func main(){c:=%q;print(c,c)}";print(c,c)}
package main;func main(){print(c+"x60"+c+"x60")};var c=`package main;func main(){print(c+"x60"+c+"x60")};var c=`
如果有更短的版本欢迎告诉我们。
三元表达式
func If(condition bool, trueVal, falseVal interface{}) interface{} {
if condition {
return trueVal
}
return falseVal
}
a, b := 2, 3
max := If(a > b, a, b).(int)
println(max)
禁止 main 函数退出的方法
func main() {
defer func() { for {} }()
}
func main() {
defer func() { select {} }()
}
func main() {
defer func() {
基于管道的随机数生成器
随机数的一个特点是不好预测。如果一个随机数的输出是可以简单预测的,那么一般会称为伪随机数。
func main() {
for i := range random(100) {
fmt.Println(i)
}
}
func random(n int)
基于select语言特性构造的随机数生成器。
Assert测试断言
type testing_TBHelper interface {
Helper()
}
func Assert(tb testing.TB, condition bool, args ...interface{}) {
if x, ok := tb.(testing_TBHelper); ok {
x.Helper() // Go1.9+
}
if !condition {
if msg := fmt.Sprint(args...); msg != "" {
tb.Fatalf("Assert failed, %s", msg)
} else {
tb.Fatalf("Assert failed")
}
}
}
func Assertf(tb testing.TB, condition bool, format string, a ...interface{}) {
if x, ok := tb.(testing_TBHelper); ok {
x.Helper() // Go1.9+
}
if !condition {
if msg := fmt.Sprintf(format, a...); msg != "" {
tb.Fatalf("Assertf failed, %s", msg)
} else {
tb.Fatalf("Assertf failed")
}
}
}
func AssertFunc(tb testing.TB, fn func() error) {
if x, ok := tb.(testing_TBHelper); ok {
x.Helper() // Go1.9+
}
if err := fn(); err != nil {
tb.Fatalf("AssertFunc failed, %v", err)
}
}
本文是全系列中第61 / 62篇:Go语言高级编程
- Go语言高级编程-序言致谢
- Go语言高级编程-Advanced Go Programming
- Go语言高级编程-第 1 章 语言基础
- Go语言高级编程-1.1 Go 语言创世纪
- Go语言高级编程-1.2 Hello, World 的革命
- Go语言高级编程-1.3 数组、字符串和切片
- Go语言高级编程-1.4 函数、方法和接口
- Go语言高级编程-1.5 面向并发的内存模型
- Go语言高级编程-1.6 常见的并发模式
- Go语言高级编程-1.7 错误和异常
- Go语言高级编程-第 2 章 CGO 编程
- Go语言高级编程-2.1 快速入门
- Go语言高级编程-2.2 CGO 基础
- Go语言高级编程-2.3 类型转换
- Go语言高级编程-2.4 函数调用
- Go语言高级编程-2.5 内部机制
- Go语言高级编程-2.6 实战: 封装 qsort
- Go语言高级编程-2.7 CGO 内存模型
- Go语言高级编程-2.8 C++ 类包装
- Go语言高级编程-2.9 静态库和动态库
- Go语言高级编程-2.10 编译和链接参数
- Go语言高级编程-第 3 章 Go 汇编语言
- Go语言高级编程-3.1 快速入门
- Go语言高级编程-3.2 计算机结构
- Go语言高级编程-3.3 常量和全局变量
- Go语言高级编程-3.4 函数
- Go语言高级编程-3.5 控制流
- Go语言高级编程-3.6 再论函数
- Go语言高级编程-3.7 汇编语言的威力
- Go语言高级编程-3.8 例子:Goroutine ID
- Go语言高级编程-3.9 Delve 调试器
- Go语言高级编程-第 4 章 RPC 和 Protobuf
- Go语言高级编程-4.1 RPC 入门
- Go语言高级编程-4.2 Protobuf
- Go语言高级编程-4.3 玩转 RPC
- Go语言高级编程-4.4 gRPC 入门
- Go语言高级编程-4.5 gRPC 进阶
- Go语言高级编程-4.6 gRPC 和 Protobuf 扩展
- Go语言高级编程-4.7 pbgo: 基于 Protobuf 的框架
- Go语言高级编程-4.8 grpcurl 工具
- Go语言高级编程-第 5 章 go 和 Web
- Go语言高级编程-5.1 Web 开发简介
- Go语言高级编程-5.2 router 请求路由
- Go语言高级编程-5.3 中间件
- Go语言高级编程-5.4 validator 请求校验
- Go语言高级编程-5.5 Database 和数据库打交道
- Go语言高级编程-5.6 Ratelimit 服务流量限制
- Go语言高级编程-5.7 layout 常见大型 Web 项目分层
- Go语言高级编程-5.8 接口和表驱动开发
- Go语言高级编程-5.9 灰度发布和 A/B test
- Go语言高级编程-5.10 补充说明
- Go语言高级编程-第 6 章 分布式系统
- Go语言高级编程-6.1 分布式 id 生成器
- Go语言高级编程-6.2 分布式锁
- Go语言高级编程-6.3 延时任务系统
- Go语言高级编程-6.4 分布式搜索引擎
- Go语言高级编程-6.5 负载均衡
- Go语言高级编程-6.6 分布式配置管理
- Go语言高级编程-6.7 分布式爬虫
- Go语言高级编程-6.8 补充说明
- Go语言高级编程-附录B:有趣的代码片段
- Go语言高级编程-附录A:Go语言常见坑