diff --git a/languages/golang.go b/languages/golang.go index 10557f6..b86ef52 100644 --- a/languages/golang.go +++ b/languages/golang.go @@ -1,145 +1,230 @@ -/** +/******************************************************************************* * Golang CHEATSHEET (中文速查表) - by chlins (created on 2018/02/14) - * Version: 1, Last Modified: 2018/02/28 16:51 + * Version: 3, Last Modified: 2018/03/07 19:51 * https://github.com/skywind3000/awesome-cheatsheets - */ - - -/** + ******************************************************************************/ + + + + /****************************************************************************** + * 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 // 发现代码中可能的错误 + + + +/******************************************************************************* * Hello World - */ -package main + ******************************************************************************/ +// main.go +package main // 包名 -import "fmt" +import "fmt" // 导入fmt包 -func main() { - fmt.Println("Hello World") +func main() { // 主函数 + fmt.Println("Hello World") // 打印输出 } -// go run main.go - - -/** - * 变量声明 - */ -// 直接使用 := 来给一个未声明的变量赋值 -a := 1 -// 通过 var 变量名 数据类型 来声明 -var a int -a = 1 +// go run main.go // 直接运行 +// go build && ./main // 先编译成二进制文件再运行 + + + +/******************************************************************************* + * 操作符 + ******************************************************************************/ +// 算数操作符 ++ - * / % // 加 减 乘 除 取余 +& | ^ &^ // 位与 位或 位异或 位与非 +<< >> // 左移 右移 +// 比较操作 +== != // 等于 不等于 +< <= // 小于 小于等于 +> >= // 大于 大于等于 +// 逻辑操作 +&& || ! // 逻辑与 逻辑或 逻辑非 +// 其他 +& * <- // 地址 指针引用 通道操作 + + + +/******************************************************************************* + * 声明 + ******************************************************************************/ +a := 1 // 直接给一个未声明的变量赋值 +var b int // var 变量名 数据类型 来声明 +var c float64 // 注意:使用var声明过的变量不可再使用 := 赋值 +a = 2 +const d = 1 // 常量 -/** - * 常量 - */ -// 常量直接使用 const 声明 -const a = 1 // golang 会自动推倒类型 -/** +/******************************************************************************* * 数据类型 - */ -// 字符 -s := "hello" -// 数值 -a := 1 // int -b := 1.2 // float64 -c := 1 + 5i // complex128 + ******************************************************************************/ +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自动计算长度 +arr1 := [3]int{4, 5, 6} // 手动指定长度 +arr2 := [...]int{1, 2, 3} // 由golang自动计算长度 // 切片 -sliceInt := []int{1, 2} // 不指定长度 +sliceInt := []int{1, 2} // 不指定长度 sliceByte := []byte("hello") // 指针 a := 1 -point := &a // 将a的地址赋给point +point := &a // 将a的地址赋给point -/** +/******************************************************************************* * 流程控制 - */ + ******************************************************************************/ // for i := 10 for i > 0 { - println(i--) + println(i--) } // if else if i == 10 { - println("i == 10") + println("i == 10") } else { - println("i != 10") + println("i != 10") } // switch switch i { case 10: - println("i == 10") + println("i == 10") default: - println("i != 10") + println("i != 10") } -/** +/******************************************************************************* * 函数 - */ + ******************************************************************************/ // 以func关键字声明 func test() {} -// 匿名函数 -f := func() {println("Lambdas function")} + +f := func() {println("Lambdas function")} // 匿名函数 f() -// 函数多返回值 -func get() (a,b string) { - return "a", "b" + +func get() (a,b string) { // 函数多返回值 + return "a", "b" } a, b := get() -/** + + + +/******************************************************************************* * 结构体 - */ + ******************************************************************************/ // golang中没有class只有struct type People struct { - Age int // 大写开头的变量在包外可以访问 - name string // 小写开头的变量仅可在本包内访问 + Age int // 大写开头的变量在包外可以访问 + name string // 小写开头的变量仅可在本包内访问 } -p1 := People{25, "Kaven"} // 必须按照结构体内部定义的顺序 -p2 := People{name: "Kaven", age: 25} // 若不按顺序则需要指定字段 +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 // 不会改变原来的值 + f.a = 1 // 不会改变原来的值 } -// 指针接收者 + // 指针接收者 func (f *Foo) test() { - f.a = 1 // 会改变原值 + f.a = 1 // 会改变原值 } -/** - * 并发 golang 的特别之处 - */ -// go 协程 + +/******************************************************************************* + * go 协程 + ******************************************************************************/ go func() { - time.Sleep(10 * time.Second) - println("hello") -}() // 不会阻塞代码的运行 代码会直接向下运行 + time.Sleep(10 * time.Second) + println("hello") +}() // 不会阻塞代码的运行 代码会直接向下运行 // channel 通道 c := make(chan int) // 两个协程间可以通过chan通信 -go func() {c <- 1}() // 此时c会被阻塞 直到值被取走前都不可在塞入新值 +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() {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() {} + + + + +/******************************************************************************* + * 一些推荐 + ******************************************************************************/ +// 入门书籍 +《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