Glang Cheatsheet 中文速查表内容,快速的上手Golang 语言。
Golang CHEATSHEET |
* Go 编译器命令 |
*****************************************************************************/ |
go command [arguments] // go 命令 [参数] |
go build // 编译包和依赖包 |
go clean // 移除对象和缓存文件 |
go doc // 显示包的文档 |
go env // 打印go的环境变量信息 |
go bug // 报告bug |
go fix // 更新包使用新的api |
go fmt // 格式规范化代码 |
go generate // 通过处理资源生成go文件 |
go get // 下载并安装包及其依赖 |
go install // 编译和安装包及其依赖 |
go list // 列出所有包 |
go run // 编译和运行go程序 |
go test // 测试 |
go tool // 运行给定的go工具 |
go version // 显示go当前版本 |
go vet // 发现代码中可能的错误 |
/******************************************************************************* |
* ENV |
*******************************************************************************/ |
GOOS // 编译系统 |
GOARCH // 编译arch |
GO111MODULE // gomod开关 |
GOPROXY // go代理 https://goproxy.io https://goproxy.cn |
GOSSAFUNC // 生成SSA.html文件,展示代码优化的每一步 GOSSAFUNC=func_name go build |
/******************************************************************************* |
* Module |
*******************************************************************************/ |
go mod init // 初始化当前文件夹,创建go.mod文件 |
go mod download // 下载依赖的module到本地 |
go mod tidy // 增加缺少的module,删除无用的module |
go mod vendor // 将依赖复制到vendor下 |
文件go.mod // 依赖列表和版本约束 |
文件go.sum // 记录module文件hash值,用于安全校验 |
/******************************************************************************* |
* 基本数据类型 |
*******************************************************************************/ |
bool // 布尔 |
string // 字符串 |
int // 无符号整型(32位操作系统上为int32,64位操作系统上为int64) |
int8 // 8位无符号整型 |
int16 // 16位无符号整型 |
int32 // 32位无符号整型 |
int64 // 64位无符号整型 |
uint // 有符号整型(32位操作系统上为uint32,64位操作系统上为uint64) |
uint8 // 8位有符号整型 |
uint16 // 16位有符号整型 |
uint32 // 32位有符号整型 |
uint64 // 64位有符号整型 |
float32 // 32位浮点数,精确到小数点后7位 |
float64 // 64位浮点数,精确到小数点后15位 |
complex64 // 32位实数和虚数 |
complex128 // 64位实数和虚数 |
byte // 类型实际是一个uint8,代表了ASCII码的一个字符 |
rune // 类型实际是一个int32,代表一个UTF-8字符 |
/******************************************************************************* |
* Hello World |
******************************************************************************/ |
// main.go |
package main // 包名 |
import “fmt” // 导入fmt包 |
func main() { // 主函数 |
fmt.Println(“Hello World”) // 打印输出 |
} |
// go run main.go // 直接运行 |
// go build && ./main // 先编译成二进制文件再运行 |
/******************************************************************************* |
* 操作符 |
******************************************************************************/ |
// 算数操作符 |
+ – * / % // 加 减 乘 除 取余 |
& | ^ &^ // 位与 位或 位异或 位与非 |
<< >> // 左移 右移 |
// 比较操作 |
== != // 等于 不等于 |
< <= // 小于 小于等于 |
> >= // 大于 大于等于 |
// 逻辑操作 |
&& || ! // 逻辑与 逻辑或 逻辑非 |
// 其他 |
& * <- // 地址 指针引用 通道操作 |
/******************************************************************************* |
* 声明 |
******************************************************************************/ |
a := 1 // 直接给一个未声明的变量赋值 |
var b int // var 变量名 数据类型 来声明 |
var c float64 |
// 注意:使用var声明过的变量不可再使用 := 赋值 |
a = 2 |
const d = 1 // 常量 |
/******************************************************************************* |
* 数据类型 |
******************************************************************************/ |
s := “hello” // 字符 |
a := 1 // int |
b := 1.2 // float64 |
c := 1 + 5i // complex128 |
// 数组 |
arr1 := [3]int{4, 5, 6} // 手动指定长度 |
arr2 := […]int{1, 2, 3} // 由golang自动计算长度 |
// 切片 |
sliceInt := []int{1, 2} // 不指定长度 |
sliceByte := []byte(“hello”) |
// 指针 |
a := 1 |
point := &a // 将a的地址赋给point |
/******************************************************************************* |
* 流程控制 |
******************************************************************************/ |
// for |
i := 10 |
for i > 0 { |
println(i–) |
} |
// if else |
if i == 10 { |
println(“i == 10”) |
} else { |
println(“i != 10”) |
} |
// if with init |
m := map[int]int{1:1} |
if v, ok := m[1]; ok { |
println(v) |
} |
// switch |
switch i { |
case 10: |
println(“i == 10”) |
default: |
println(“i != 10”) |
} |
// 三目表达式 |
注意:Golang没有三目表达式 |
/******************************************************************************* |
* 函数 |
******************************************************************************/ |
// 以func关键字声明 |
func test() {} |
f := func() {println(“Lambdas function”)} // 匿名函数 |
f() |
func get() (a,b string) { // 函数多返回值 |
return “a”, “b” |
} |
a, b := get() |
/******************************************************************************* |
* 结构体 |
******************************************************************************/ |
// golang中没有class只有struct |
type People struct { |
Age int // 大写开头的变量在包外可以访问 |
name string // 小写开头的变量仅可在本包内访问 |
} |
p1 := People{25, “Kaven”} // 必须按照结构体内部定义的顺序 |
p2 := People{name: “Kaven”, age: 25} // 若不按顺序则需要指定字段 |
// 也可以先不赋值 |
p3 := new(People) |
p3.Age = 25 |
p3.name = “Kaven” |
/******************************************************************************* |
* 方法 |
******************************************************************************/ |
// 方法通常是针对一个结构体来说的 |
type Foo struct { |
a int |
} |
// 值接收者 |
func (f Foo) test() { |
f.a = 1 // 不会改变原来的值 |
} |
// 指针接收者 |
func (f *Foo) test() { |
f.a = 1 // 会改变原值 |
} |
/******************************************************************************* |
* go 协程 |
******************************************************************************/ |
go func() { |
time.Sleep(10 * time.Second) |
println(“hello”) |
}() // 不会阻塞代码的运行 代码会直接向下运行 |
// channel 通道 |
c := make(chan int) |
// 两个协程间可以通过chan通信 |
go func() {c <- 1}() // 此时c会被阻塞 直到值被取走前都不可在塞入新值 |
go func() {println(<-c)}() |
// 带缓存的channel |
bc := make(chan int, 2) |
go func() {c <- 1; c <-2}() // c中可以存储声明时所定义的缓存大小的数据,这里是2个 |
go func() {println(<-c)}() |
/******************************************************************************* |
* 接口 |
******************************************************************************/ |
// go的接口为鸭子类型,即只要你实现了接口中的方法就实现了该接口 |
type Reader interface { |
Reading() // 仅需实现Reading方法就实现了该接口 |
} |
type As struct {} |
func (a As) Reading() {} // 实现了Reader接口 |
type Bs struct {} |
func (b Bs) Reading() {} // 也实现了Reader接口 |
func (b Bs) Closing() {} |
/******************************************************************************* |
* 泛型(v1.18) |
******************************************************************************/ |
func Sum[T int | float32 | float64](x, y T) T { |
return x + y |
} |
type Number interface { |
int | int32 | int64 | float64 | float32 |
} |
type SliceAdditon[T Number] struct { |
data []T |
} |
func (sa *SliceAdditon[T]) Sum() T { |
var sum T |
for _, v := range sa.data { |
sum += v |
} |
return sum |
} |
func Caller() { |
sInt := Sum(1, 2) // Sum[int] |
sFloat := Sum(1.1, 2.2) // Sum[float64] |
println(sInt, sFloat) |
saInt := SliceAdditon[int]{data: []int{1, 2, 3, 4, 5}} |
saFloat64 := SliceAdditon[float64]{data: []float64{1.1, 2.2, 3.3, 4.4, 5.5}} |
println(saInt.Sum()) |
println(saFloat64.Sum()) |
} |
/******************************************************************************* |
* 一些推荐 |
******************************************************************************/ |
// 入门书籍 |
《Go学习笔记》 // 雨痕的 |
《Go语言实战》 // 强烈推荐 |
// 网上资料 |
https://github.com/astaxie/build-web-application-with-golang // 谢大的 |
https://github.com/Unknwon/the-way-to-go_ZH_CN // 无闻 |
https://github.com/Unknwon/go-fundamental-programming // 无闻教学视频 |
// 第三方类库 |
https://golanglibs.com/ |
// 大杂烩 |
https://github.com/avelino/awesome-go |
/******************************************************************************* |
* References |
******************************************************************************/ |
https://github.com/a8m/go-lang-cheat-sheet |
https://github.com/LeCoupa/awesome-cheatsheets |