这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
字符串
- 函数外的每个语句都必须以关键字开始(var、const、func等)
- :=不能使用在函数外。
- _多用于占位,表示忽略值。
字符串操作
func traversalString() {
s := "字节跳动bytedance"
for i, r := range s {
fmt.Printf("%d(%c) ", i, r) //i不连续,因为有中文,中文3个字节
}
}
输出i不连续,UTF-8中文字符占3个字节
0(字) 3(节) 6(跳) 9(动) 12(b) 13(y) 14(t) 15(e) 16(d) 17(a) 18(n) 19(c) 20(e)
使用strings.Builder
- 使用+拼接性能最差,strings.Builder,strings.Buffer相近,strings.Buffer更快
- 字符串在Go元中是不可变类型,占用内存的大小是固定的
- 使用+每次都会重新分配内存
- strings.Builder,strings.Buffer底层都是[]byte数组
- 内存扩容策略,不需要每次拼接重新分配内存
数组
- 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。
- 指针数组 [n]*T,数组指针 *[n]T
函数定义
- FuncName:函数名称,根据约定,函数名首字母小写即为private,大写即为public
- 参数列表:函数可以有0个或多个参数,参数格式为:变量名 类型,如果有多个参数通过逗号分隔,不支持默认参数
多个defer执行顺序
- 如果一个函数中有多个defer语句,它们会以LIFO的顺序执行。函数或某个延迟调用发生错误,这些调用依旧会被执行
指针
go语言虽然保留了指针,但与其他编程语言有不同:
- 默认值nil,没有NULL常量
- 操作符"&"取变量地址,"*"通过指针访问目标对象
- 不支持指针运算,不支持"->"运算符,直接用"."访问目标成员
可见性
- go语言没有private、protected、public的关键字
- 要使某个符号对其他包(package)可见,需要将该符号定义为以大写字母开头