这些 go 格言谚语大多出自 Rob Pike 振奋人心的演讲视频,有很大参考价值。
Don't communicate by sharing memory, share memory by communicating.
不要通过共享内存进行通信, 通过通信共享内存
Go 的并发原语 (goroutines 和 channels) 为构造并发软件提供了一种优雅而独特的手段. Go 鼓励使用 channels 在 goroutines 之间传递对数据的引用, 而不是显式地使用锁来调解对共享数据的访问. 这种方法确保只有一个 goroutine 可以在给定的时间访问数据.
Concurrency is not parallelism.
并发不是并行
在编程中, 并发是独立执行的进程的组成, 而并行则是 (可能相关的) 计算的同时执行. 并发是一次处理很多事情. 并行是一次做很多事情.
Channels orchestrate; mutexes serialize.
Channels 重排序; 互斥量串行化
可以用下面例子理解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
import "fmt"
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // 此处如果改成互斥量一样可以做到
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c
fmt.Println(x, y, x+y)
}
The bigger the interface, the weaker the abstraction.
接口越大, 抽象越弱
接口背后的概念是通过将对象的行为抽象为简单的契约来允许重用性. 虽然接口不是 Go 专有的, 但由于 Go 接口通常趋向于小型化, Go 程序员才广泛使用它们. 通常情况下, 一个接口只限于一到两个方法.
Go io 包接口就是典型的例子.
Make the zero value useful.
充分利用零值
零值的典型例子如 bytes.Buffer
和 sync.Mutex
:
1
2
3
4
5
6
7
var buf bytes.Buffer
buf.Write([]byte("hello"))
fmt.Println(buf.String())
var mu sync.Mutex
mu.Lock()
mu.Unlock()
interface{} says nothing.
interface{} 言之无物
该类型无静态检查以及调用时保证, 比如你的 func 接收一个 interface{} 类型, 你写的时候是可用的, 但是某个时间你进行了代码重构可能坏掉了.
Gofmt's style is no one's favorite, yet gofmt is everyone's favorite.
Gofmt 的风格没有人喜欢, 但是 gofmt 是每个人的最爱,少些风格之争,用这些时间多写代码。
A little copying is better than a little dependency.
小复制好过小依赖,如果你可以手动撸小快代码就不要导入一个库去做
Syscall must always be guarded with build tags.
系统调用必须始终使用构建标签保证
不同的系统 (*NIX, Windows) 调用导致同一个 func (实现并不一样) 可能需要在不同的系统上构建才能得到你想要的结果. 简单说就是系统调用不可移植才这么干. 示例可参见 Go 标准库 syscall.
Cgo must always be guarded with build tags.
Cgo 必须始终使用构建标签保证
Cgo is not Go.
Cgo 不是 Go,能不用就不要用 Cgo
With the unsafe package there are no guarantees.
unsafe 包无保证,你可以使用 unsafe 包如果你准备好了有一天它会坏掉
Clear is better than clever.
清晰好过聪明, “写清晰的代码, 不要写聪明的代码”
Reflection is never clear.
反射永远不是清晰的,只有很少很少的人应该用反射这个非常强大而又非常难的特性. 新手应该远离反射和 interface{}.
Errors are values.
错误也是一种值,值可以被编程, 并且由于错误是值, 所以错误可以被编程.
Don't just check errors, handle them gracefully.
不要止步于检查错误而要优雅的处理
Design the architecture, name the components, document the details.
设计架构, 命名组件, 记录细节
当你写一个大型系统的时候, 你把它设计成一种结构化的东西. 想象组件的每一个部分并行工作, 为不同的组件起好的名字, 因为这些名字会出现在稿纸上.
Documentation is for users.
文档是针对用户的,把自己当成使用者而不是写它的人, 那么 godoc 上的文档就是对用户有用的
Don't panic.
不要使用 panic 进行正常的错误处理. 使用错误 (error) 和多个返回值.
本文网址: https://golangnote.com/topic/286.html 转摘请注明来源