Go速查手册

/*******************************************************************************

  • Golang CHEATSHEET (中文速查表) - by chlins (created on 2018/02/14)
  • 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// 发现代码中可能的错误

/*******************************************************************************

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值