Golang 速成手册
如何使用集合
如何使用切片
// 特性: 可变、引用传递、堆分配
a := []int{1,2,3,4,5} // 简写并初始化
// 也可以指定下标进行占位
a := []int{0:1,4:3}
// 增加
a = append(a, 6)
// 删除
// 要删除的元素下标
index := 2
// 删除元素
slice = append(slice[:index], slice[index+1:]...) // 这也是数组的合并
// 修改和读取同数组关于切片中的长度和容量的含义
// 长度(Length)指的是切片当前包含的元素个数。
// 容量(Capacity)指的是底层数组的大小,即切片可以容纳的元素个数, 即系上限。
a := make([]byte, 5, 10) // 这意味着切片 a 可以容纳最多 10 个 byte 类型的元素,但当前只有 5 个元素。
// 可以不指定容量
a := make([]byte, 5)
// 语法解释 a[b:c] =>
// b 表示当前的下标,若空时则表示下标为0
// c 表示当前的下标, 若空时则表示下标为 len(a)
s := x[:] // 切片s指向了数组x的内存空间,改变切片s的值,也会影响数组x的值如何遍历切片
for k,v := range a {}
for _,v := range a {} // 不需要下标
for k := range a {} // 只需要下标
for range time.Tick(time.Second) {} // 都不需要如何使用数组
// 特性:大小长度固定、值传递、栈分配
a := [5]int{1,2,3,4,5}
// 无法增加或者删除
// 修改
a[3] = 6
// 读取
a[3]如何使用switch
switch a {
case "a":
// todo
case "b", "c": // 匹配任何一个 b 或者 c 即可
// todo
default:
// todo
}
// 也可以前置一条语法代码
switch a:=1; a { ... }如何使用for循环
for {} // 相当于 while true
for a < 19 {} // 相当于 while a < 19
for a := 10; a<99; a++ {} // 普通用法
// 额外地也支持 break 和 continue 与 外层的label 配合
here:
for i := 0; i < 2; i++ {
for j := i + 1; j < 3; j++ {
if i == 0 {
continue here
}
fmt.Println(j)
if j == 2 {
break
}
}
}
there:
for i := 0; i < 2; i++ {
for j := i + 1; j < 3; j++ {
if j == 1 {
continue
}
fmt.Println(j)
if j == 2 {
break there
}
}
}如何使用if的结构
if a > 0 {}
// 可额外添加代码语句并用分号结束
if a := b+c; a > 0 {}关于包的与默认约束
在每个Go源文件的最开头(不包括注释)添加包声明
可执行文件在main包里
惯例:包名 == 包导入路径的最后一个名称(导入路径 math/rand => 包名 rand)
大写字母开头的标识符: 表示可导出(exported)标识符, 对其它包可见
小写字母开头的标识符: 表示私有(private)标识符,对其它包不可见如何声明函数
func a() {}
func a(b int){}
func a(b, c int){} // 多个相同类型
func a() string {}
// 返回值
func a() (int,string){
return 1, "1"
}
// 返回标志符, 只需要直接返回return
func a() (b int, c string){
b = 1
c = "1"
return
}函数的传递和闭包
// 作为 参数 使用
add := func(a,b)int{
return a+b
}
// 作为 返回值 使用
func wrapAdd() (add func() int) {
c := 1
add = func() int { return c }
return
}函数可变参数
func a(args ...int) int {
return 1
}如何声明相关变量
var a int = 1
a := 1
const a = "1"iota 妙用
-
自增枚举值
const ( Red = iota // 0 Green // 1 Blue // 2 ) -
使用位操作进行标志常量
const ( FlagNone = 0 // 0 FlagA = 1 << iota // 1 FlagB = 1 << iota // 2 FlagC = 1 << iota // 4 ) -
跳过不需要的值
const ( _ = iota // 跳过第一个枚举值 January = 1 + iota // 1 February // 2 March // 3 )
引入其他文件方式
- 相对路径导入:使用相对路径导入其他文件。这种方式适用于在同一个项目中引用其他文件。例如,
import "./utils"将引入当前项目中的utils文件。 - 绝对路径导入:使用绝对路径导入其他文件。这种方式适用于引用位于不同项目或库中的文件。例如,
import "github.com/example/package"将引入github.com/example/package包中的文件。 - 标准库导入:Go 语言提供了许多标准库,可以直接使用它们而无需进行额外的导入。例如,
import "fmt"将导入标准库中的fmt包。 - 别名导入:可以为导入的包或文件设置别名,以便在代码中使用更简洁的名称。例如,
import utils "github.com/example/package"将为github.com/example/package设置别名为utils,之后可以使用utils来访问该包的内容。 - 空白标识符导入:有时你可能只是想为了执行文件中的
init函数,而不需要使用该文件中的其他内容。在这种情况下,可以使用空白标识符_进行导入。例如,import _ "github.com/example/package"将执行github.com/example/package包中的init函数,但不会在代码中使用该包的其他内容。 - 使用点操作符导入的好处是可以使代码更简洁,但也可能导致代码可读性下
常用cli命令
go build:用于编译 Go 代码并生成可执行文件。例如,go build main.go 将编译 main.go 文件并生成可执行文件。
go run:用于编译并运行 Go 代码。例如,go run main.go 将编译并直接运行 main.go 文件。
go test:用于运行 Go 单元测试。通过 go test 命令,可以自动运行项目中的测试文件并输出测试结果。
go get:用于获取并安装第三方依赖包。例如,go get github.com/example/package 将获取并安装 github.com/example/package 依赖包。
go mod init:用于初始化 Go 项目的模块管理。通过执行 go mod init 命令,可以创建一个新的 go.mod 文件,用于管理项目的依赖关系。
go mod tidy:用于自动清理项目中不再使用的依赖项。运行 go mod tidy 命令会检查项目的依赖关系,并删除不再需要的依赖项。
go mod vendor:用于将项目的依赖项复制到项目的 vendor 目录下。通过运行 go mod vendor 命令,可以将所有依赖项复制到项目中,以便离线构建和部署。
go doc:用于查看 Go 代码的文档。例如,go doc fmt.Println 将显示 fmt 包中 Println 函数的文档。