Origins
What is the purpose of the project?
编译快,依赖关系分析简单,轻量级(非继承)的类型系统,垃圾回收,并发执行和通讯,在多核平台的系统级软件Why are you creating a new language?
快速编译,快速执行,容易编写这三者无法同时满足。What are the guiding principles in the design?
保持正交性:可以为任何类型定义方法,结构体表示数据,接口表示抽象等等。
Usage
Design
Why does Go not have generic types?
目前没有很好的实现机制,而且不是非常必要,保留问题。Why does Go not have exceptions?
采用多返回值和panic and recover
机制实现异常处理。Why build concurrency on the ideas of CSP?
Occam
和Erlang
都应用了CSP
理论,Golang
的主要贡献是提出了显式定义的通道。
Types
How do I get dynamic dispatch of methods?
使用接口。How can I guarantee my type satisfies an interface?
借助于赋值操作
type T struct{}
var _ I = T{} // Verify that T implements I.
如果想要一个接口的用户明确声明他们实现了该接口,那么可以在接口中添加一个有描述性的名字,比如
type Fooer interface {
Foo()
ImplementsFooer()
}
- Why doesn't type T satisfy the Equal interface?
Go
中的类型系统不自动提升类型。 - Can I convert a []T to an []interface{}?
不能直接转换,需要逐个元素转换。 - Why is my nil error value not equal to nil?
Interface
的底层结构包含两个元素,type
和value
。
Values
Why don't maps allow slices as keys?
实现切片的相等性需要考虑深浅比较,指针或值的比较,递归类型等等,目前没有一个清晰的想法。Why are maps, slices, and channels references while arrays are values?
不太懂
Writing Code
Pointers and Allocation
When are function parameters passed by value?
类似于C
家族的所有语言,Go
中按值传递。Should I define methods on values or pointers?
把receiver
当成函数的参数,然后按照按值或按指针传递的规则考虑。
Concurrency
Functions and Methods
- What happens with closures running as goroutines?
用go vet
检查代码。
Control flow
Packages and Testing
- How do I write a unit test?
添加_test.go
到package
目录中,导入testing
包,并实现一些测试函数。
Implementation
Performance
- Why does Go perform badly on benchmark X?
Golang
中的许多库还没有针对性的优化。
Changes from C
- Why is there no pointer arithmetic?
为了安全性,同时技术的发展使得数组下标的运算与指针算术同样高效。并且简化垃圾回收器的实现。