Skip to Content
博客Golang 速成手册

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 )

引入其他文件方式

  1. 相对路径导入:使用相对路径导入其他文件。这种方式适用于在同一个项目中引用其他文件。例如,import "./utils" 将引入当前项目中的 utils 文件。
  2. 绝对路径导入:使用绝对路径导入其他文件。这种方式适用于引用位于不同项目或库中的文件。例如,import "github.com/example/package" 将引入 github.com/example/package 包中的文件。
  3. 标准库导入:Go 语言提供了许多标准库,可以直接使用它们而无需进行额外的导入。例如,import "fmt" 将导入标准库中的 fmt 包。
  4. 别名导入:可以为导入的包或文件设置别名,以便在代码中使用更简洁的名称。例如,import utils "github.com/example/package" 将为 github.com/example/package 设置别名为 utils,之后可以使用 utils 来访问该包的内容。
  5. 空白标识符导入:有时你可能只是想为了执行文件中的 init 函数,而不需要使用该文件中的其他内容。在这种情况下,可以使用空白标识符 _ 进行导入。例如,import _ "github.com/example/package" 将执行 github.com/example/package 包中的 init 函数,但不会在代码中使用该包的其他内容。
  6. 使用点操作符导入的好处是可以使代码更简洁,但也可能导致代码可读性下

常用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 函数的文档。