go get ... // -u
go install ...
go run xxx.go
go build xxx.go
./xxx
go test xxx // -cpu, -count, -parallel, -v, -cover, -bench, -benchmem, -cpuprofile, -trace
go env
go env GOCACHE
go clean
go clean -cache
go clean -testcache
go tool pprof prof cpu.prof
go-torch xxx
go tool trace
Name
规范:驼峰式。
Keyword
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
Predeclared
不是关键字,可以重新定义。但是一般不会这么做,以防止混淆。
Constants: true false iota nil
Types: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
Functions: make len cap new append copy close delete
complex real imag
panic recover
Visible
在 function 内声明,则在 function 内可见。
在包级别声明,且小写字母开头,则同一个包的所有文件可见。
在包级别声明,且大写字母开头,表示 exported,可被别的包访问。
Declarations
package
import
var const type func
Variables
// 标准格式
var name type = expression
// type 和 expression 可以省略其中一个。
// 若省略 type,则 type 由 expression 决定;
// 若省略 expression,则初始值为 zero value。
in, err := os.Open("1")
out, err := os.Open("2") // err 为赋值,out 为声明
in, err := os.Open("1")
in, err := os.Open("2") // 编译错误
in, err := os.Open("1")
in, err = os.Open("2") // 若左边全部已经声明,则应该用赋值
Pointer
&x // address of x
*p // 指针 p 指向的变量的值
x := 1
p := &x // type of p is *int
*p = 2 // x = 2
// 指针相等 p1 == p2:都为 nil 或指向同一变量
// 返回函数中局部变量的地址是安全的,不会被回收
var p = f()
func f() *int {
v := 1
return &v
}
new Function
使用较少。
// new(T) 创建一个 T 类型的变量,初始化为 T 类型的零值,返回变量地址
p := new(int) // type of p is *int
var global *int
func f() {
var x int
x = 1
global = &x // x 会被分配在堆上,因为函数返回后仍可通过 global 访问到,叫做 x 从函数 f 中逃逸了。
}
func g() {
y := new(int)
*y = 1 // *y 可以分配在栈上
}