2017年超有价值的Golang文章
原文链接: 2017年超有价值的Golang文章
基础语法
- Close Channels Gracefully in
Golang:
如何优雅地关闭channel? - Compile-time assertions in
Go: 编译时断言 - Why are slices sometimes altered when passed by value in
Go?:
Go不是按值传递么,怎么slice传入后被更改了呢?其实map也一样 - Bit Hacking with
Go: Go的位操作 - Go Range Loop
Internals:
range内幕 - Blocks and Scopes in
Golang:
代码块和作用域 - Address Alignments in
Go:地址对齐 - Understand Go pointers in less than 800
words:回顾一下指针的概念 - Another Introduction to Pointers in
Go:另一篇关于指针的介绍 - There is no pass-by-reference in
Go:
Go中没有引用传值 - Why golang garbage-collector not implement Generational and Compact
gc?:
为什么不使用分代或者压缩的垃圾回收器? - Modern garbage
collection:
Go的垃圾回收器 - Language Mechanics On Stacks And
Pointers:
William Kennedy写的系列, 一共四篇, 深入底层 - Structures:
Go struct介绍 - Go调度详解: 调度概览
- 也谈goroutine调度器:
也谈谈Go的调度器 - 了解 Go 1.9
的类型别名: Go
1.9中的类型别名 - Golang Internals Part 2: Nice benefits of named return
values:
返回值采用命名方式的好处 - Go Interface
源码剖析:
interface源代码 - Survey of Rounding Implementations in
Go:
四舍五入不简单 - Golang
热更新研究笔记:
热更新笔记 - go empty
interface:空接口 - 理解 go interface 的 5
个关键点:
接口关键点 - Go汇编实战的坑:
赞,国人给golang提patch - golang语言编译的二进制可执行文件为什么比 C
语言大:深入分析 - init functions in
Go:init函数不简单 - Efficient Bit Manipulation in Go
1.9: 有效的位操作 - Learn Go constants --- A visual
guide:可视化系列 - Go cheatsheet:小抄
- defer in
go:
还有第二部分
part2 - Using named return variables to capture panics in
Go:
返回panic的错误 - Go Reflection: Creating Objects from
Types:基本类型,
part2其它类型
测试
- Go advanced testing tips &
tricks:
Go测试提示和技巧 - 5 simple tips and tricks for writing unit tests in
#golang:写测试的5个技巧 - 5 Advanced Testing Techniques in
Go:
5个测试的高级技术
调试和性能调优
- Profiling and optimizing Go web
applications:
优化web程序,使用profiler - go tool trace:
trace工具介绍的很少,这是其中一篇 - Debugging Go core dumps:使用core
dump调试 - Benchmarking Go
programs:
测试和pprof,
第二部分 - GO APP MONITORING: EXPVAR, PROMETHEUS AND
STATSD:
监控实践 - 一个内部API系统的性能优化:
国内用户的优化实践 - Profiler labels in
Go:不常用但是有用的技巧 - diagnostics:
官方的介绍更准确,诊断。 - Go\'s work-stealing
scheduler:rakyll的介绍 - 3倍性能的go程序优化实践:
国内的优化实践 - Seven steps to 100x
faster:
100倍的性能提升 - A Million WebSockets and
Go:
百万websocket连接和性能提升经验 - Golang 与系统调用:
根据演讲整理 - Performance comparison of regular expression
engines:正则表达式库的性能比较 - Allocation Efficiency in High-Performance Go
Services:有效的内存分配 - 使用 bcc/BPF 分析 go
程序:
Brendan Gregg的文章 - Your pprof is
showing:
pprof,不想多说了 - Using the Go tracer to speed up fractal
making:go
tracer - Profiling Go:
很好profile总结 - The new pprof user interface: go
1.10中已包含新界面 - High Performance
Go:Dave
Cheney在QComSF 2017上的演讲 - Go Profiler
Internals:所谓的profile内幕 - Optimizing GoLang for High Performance with ARM64
Assembly:
针对ARM64的优化
标准库
- Plugins in Go
1.8:
对Go 1.8增加的plugin包的速览 - TCP/IP Networking: 网络编程入门
- Linux, Netlink, and Go --- Part 1:
netlink:访问linux
netlink,还有第二篇和第三篇 - Port Forwarding with Go:
端口转发 - Writing Modular Go Programs with
Plugins:
插件 - Advanced command execution in Go with
os/exec:学习os/exec - expvar in
action:知道这个标准包吗,用过吗? - Golang 互斥锁内部实现:
Go的锁实现 - Go unsafe
包之内存布局:
unsafe的一些函数 - Go 1.9
sync.Map揭秘:
sync.Map的实现揭秘 - Basic AST Traversal in Go:
ast,做工具和代码分析的都需要 - A Go Programmer\'s Guide to
Syscalls:Liz
Rice的演讲 - Pitfalls of context values and how to avoid or mitigate them in
Go:
Context的陷阱以及如何避免它 - The 30 Most Popular Go String
Functions:
最常用的strings的30个方法 - Serving HTTPS: 应用https
- How To Trust Extra CA Certs In Your Go
App:
使用外部的CA - GOLANG中time.After释放的问题:
time.After使用的时候注意事项 - The new kid in town --- Go's
sync.Map:sync.Map的性能 - The ultimate guide to writing a Go
tool:
Go工具开发终极手册,gomodifytags的作者 - Streaming IO in
Go:
io - Things to know about HTTP in
Go:
Go HTTP - Important interfaces that every Go developer should
know:
重要接口 - Go Walkthrough:
fmt:
fmt详解 - Context API
explained:context详解 - Basic AST Manipulation in
Go:还是ast - In-depth introduction to bufio.Scanner in
Golang:深入介绍bufio.Scanner - Go Slice vs
Maps:性能比较 - Introduction to bufio package in
Golang:
bufio介绍 - TCP Socket Implementation On
Golang:
从外部推断内部实现 - Understanding Go programs with
go/parser:
带你学习go/parser - unsafe.Pointer and system
calls:理解
unsafe.Pointer和系统调用 - Using Go
Templates:使用模板
编程模式
- Functional Options Pattern in
Go:
介绍了参数以函数子的方式实现,更出名的是Rob
Pike提出的这种模式,以及Dave
Cheney的进一步介绍。 - A Story of a Fat Go
Binary:
使用gofat给Go程序瘦身 - a size profiler for
binaries:瘦身瘦身,google出品 - How to ship production-grade
Go:开发产品级的程序 - Go programming language secure coding practices
guide:安全代码指南 - Error handling patterns in
Go:
Go的错误处理总是让人困惑 - Alternative Patterns for Method Overloading in
Go:
Go的方法重载的可选实现 - Go, without package scoped
variables:
不推荐包级别的变量,但是怎么做呢 - Don't defer Close() on writable
files:
defer会忽略错误 - Go Patterns: Go设计模式
- Golang Concurrency
Tricks:channel和goroutine技巧 - go make 和 new
的区别: 区别 - Context isn't for
cancellation:
Context目的不是为了cancel - Inject build-time variables with
Golang: - go advices: Go建议清单
- Error handling in
Upspin:
Rob Pike的实践 - Dynamic JSON in Go:
使用*json.RawMessage
和interface{}
开发技巧
- Adding custom data to Go binaries at compile
time:
编译时给二进制文件加点料 - Go Quickstart Tips for Experienced
Programmers:
给经验丰富的程序员的一些Go的小贴士 - Gracefully terminate a program in
Go:优雅滴关闭程序 - Golang 中使用 JSON 的小技巧:
JSON使用的小技巧 - How to find out which Go version built your
binary:
debug发现Go版本 - Generating good unique ids in
Go:产生唯一的ID - Fencing off Go Applied - A Practical Look at a Go Research
Paper: 使用
dingo-hunter 和 Gong 编译时检查死锁和channel - Go Tooling in
Action:
Go开发时的一些工具介绍 - How to use conditional compilation with the go build
tool:条件编译 - Strace in 60 lines of
Go:
实现strace - 3 ways to iterate in
Go:三种方式遍历 - RustGo: Calling Rust From Go with Little
Overhead:高效的从Go调用Rust - Version Constraints and
Go:指定的Go版本才能编译 - 6 Go Tips You Should (probably not)
Use:
6个Go小技巧,但是你不应该在代码中使用, :) - 15 Lessons in
Golang:15个经验教训 - Using functional options instead of method chaining in
Go:
使用函数式参数,而不是链式操作 - 合理配置GOMAXPROCS提升一倍以上的性能:
对于I/O密集型的程序,建议设置GOMAXPROCS大一些 - Lint your #golang code like a mad
man!:
像牛人一样编写代码 - Rate Limiting Service Calls in
Go:限流 - Sending HTML email using
Go:发送html邮件 - Go Assembly 示例: Go使用汇编的例子
- go web examples:web开发例子
- Handling CORS In A Golang Web
Application:CORS处理 - Understanding Go panic
output:
理解Go的panic输出 - Go语言中实现基于 event-loop
网络处理:不同的思路 - Generating Go structs from
JSON:5个json to
gostruct的工具 - go语言死循环分析:当然不是go的bug,看看go的讨论
- Access unexported fields in
golang/reflect:
访问unexported的字段 - Why is port a string and not an
integer:URL.Port
为什么是字符串而不是整数? - golang: How the select worked when multiple channel
involved:使用伪随机 - How to reuse request body of
*http.Request:
request.Body读完就不能再多了,如何重用?
面试题
- golang 面试题:
诺唯总结的11个面试题,
解答 - Golang精编100题:选择题和填空题,试试看
第三方库
- Infinite Sets in
Go:
把set实现玩出花 - awesome-go-storage:
100多个Go语言实现的存储引擎,强不强大? - Learn Web Programming in Go by
Examples:
类似gobyexamples,这次奉上的是关于web开发的 - Visualizing Concurrency in
Go:可视化goroutine - Network Protocol Breakdown: Ethernet and
Go:
学习底层网络协议处理 - 再谈谈获取 goroutine id
的方法:
goroutine ID的获得,hacker方式 - Listen gRPC and HTTP requests on the same
port:
grpc和http共用端口 - gRPC-Go performance
Improvements:
gRPC近期的性能优化 - Building Blockchain in
Go:使用Go编写区块链程序系列 - Minimal Perfect Hash
Functions:完美的hash函数,极小
应用
- 今日头条Go建千亿级微服务的实践:
今日头条的微服务
版本新特性
- 5 things to watch in Go programming in
2017:
G0 1.8新的特性介绍 - Go 1.8:
2016最后一天写的,也算做2017年的文章吧 - The State of Go - February
2017:
2017对Go的综评,来自Go团队 - What is new in Go
1.8:
what\'s new? - Logging, interfaces, and
allocation: Go
1.9中的一点优化 - HTTP/2 Server Push: http2 push功能
- The State of Go - May
2017: The
State of Go系列 - What's new in Google's Go
1.9:
what\'s new - Toward Go 2: 目标Go2
- Go
1.9中值得关注的几个变化:
what\'s new in go 1.9 - improve timers scalability on multi-CPU
systems: go
1.10提升timer性能 - Go 1.10 Release Notes: go
1.10先睹为快 - Golang 1.10 前瞻: 新特性