这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
【后端专场 学习资料一】第五届字节跳动青训营 - 掘金 (juejin.cn)
Go 语言上手 - 基础语法 .pptx - 飞书云文档 (feishu.cn)
函数
-
函数定义语法
func name(parameter-list) (result-list) { body } -
Go语言不支持函数重载
-
函数可以作为参数传递
func f1(a, b, c int){} func f2(a, b int) (int, int, int){} // 调用 func main(){ f1(f2(1, 2)) } -
Go的函数支持多值返回,大部分业务代码都会返回两个参数,一个是所需数据data,一个是错误信息err
-
Go的函数支持命名返回值的特性
func f1(input int) (a int, b int){ a = 2*input b = 3*input // 常规返回写法 //return a, b // 特性写法 return } -
可变长参数语法
// 语法 func functionName(value1 type, value2 ...type) // 示例 func main() { x := min(1, 2, 3, 4) fmt.Printf("The minimum is: %d\n", x) // 打印:The minimum is: 0 arr := []int{7,9,3,5,1} x = min(arr...) fmt.Printf("The minimum in the array is: %d", x) //打印:The minimum in the array is: 1 } func min(a ...int) int { if len(a)==0 { return 0 } min := a[0] for _, v := range a { if v < min { min = v } } return min } -
关键字defer:允许我们推迟到函数返回之前一刻才执行某个语句或函数,如果return语句中包含一些操作,则会先操作完再执行defer标记的命令
-
多个 defer 行为被注册时,它们会以逆序执行
func f(){ for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) } } // 打印:4 3 2 1 0 -
匿名函数,可以赋值于某个变量,也可以直接对匿名函数进行调用
func(x, y int) int { return x + y }(0, 2) add := func(x, y int) int { return x + y } add(0, 2)
切片
-
Go中数组申明语法
var arrName [len]type // 求数组长度 len(arr) // for-range语法 for value, _ := range arr{ .... } -
切片(slice)是对数组一个连续片段的引用
-
切片是可索引的,并且可以由 len() 函数获取长度
-
切片提供了计算容量的函数 cap() 可以测量切片最长可以达到多少,且不等式永远成立: 0 <= len(s) <= cap(s)
-
切片申明格式
// 不需说明长度 var sliceName []type -
一个切片在未初始化之前默认为 nil,长度为 0
-
make()创建切片
// 创建长度为50,容量为100的切片 v := make([]int, 50, 100) -
切片的for-range语法:第一个返回值 ix 是数组或者切片的索引,第二个是在该索引位置的值
for ix, value := range slice1 {} -
切片追加
s = append(s, 1, 2, 3, 4) -
字符串生成切片
c := []byte(s) -
利用切片修改字符串中某个位置字符
s := "hello" c := []byte(s) c[0] = ’c’ s2 := string(c) // s2 == "cello"
Map
-
map 是引用类型,声明语法:
var map1 map[keytype]valuetype map2 := make(map[keytype]valuetype, cap) -
未初始化的 map 的值是 nil
-
map第二个值表示这对key-value是否存在
value, ok := map1[key1] // 如果key1存在则ok == true,否则ok为false -
map的for-range语法
for key, value := range map1 { ... }