Go基础的细节 | 青训营笔记

76 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记

字符串

  1. 函数外的每个语句都必须以关键字开始(var、const、func等)
  2. :=不能使用在函数外。
  3. _多用于占位,表示忽略值。

字符串操作

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数组
  • 内存扩容策略,不需要每次拼接重新分配内存

数组

  1. 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。
  2. 指针数组 [n]*T,数组指针 *[n]T

函数定义

  • FuncName:函数名称,根据约定,函数名首字母小写即为private,大写即为public
  • 参数列表:函数可以有0个或多个参数,参数格式为:变量名 类型,如果有多个参数通过逗号分隔,不支持默认参数

多个defer执行顺序

  • 如果一个函数中有多个defer语句,它们会以LIFO的顺序执行。函数或某个延迟调用发生错误,这些调用依旧会被执行

指针

go语言虽然保留了指针,但与其他编程语言有不同:

  • 默认值nil,没有NULL常量
  • 操作符"&"取变量地址,"*"通过指针访问目标对象
  • 不支持指针运算,不支持"->"运算符,直接用"."访问目标成员

可见性

  • go语言没有private、protected、public的关键字
  • 要使某个符号对其他包(package)可见,需要将该符号定义为以大写字母开头