知识点梳理
- 函数外的每个语句都必须以关键字开始(var、const、func等)
-
整型和浮点型变量的默认值为
0
。 字符串变量的默认值为空字符串
。 布尔型变量默认为false
。 切片、函数、指针变量的默认为nil
-
数据类型:除了基本的整型、浮点型、布尔型、字符串外,还有数组、切片、结构体、函数、map、通道(channel)等
-
字符串使用
双引号(")
-
多行字符串时,就必须使用
反引号
,反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出s1 := `第一行 第二行 第三行 ` fmt.Println(s1)
- 组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号(’)包裹起来,如:
var a = '中' var b = 'x'
- 字符串底层是一个byte数组,所以可以和
[]byte
类型相互转换 -
rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
-
要修改字符串,需要先将其转换成
[]rune
或[]byte
,完成后再转换为string
。无论哪种转换,都会重新分配内存,并复制字节数组。func changeString() { s1 := "big" // 强制类型转换 byteS1 := []byte(s1) byteS1[0] = 'p' fmt.Println(string(byteS1)) s2 := "白萝卜" runeS2 := []rune(s2) runeS2[0] = '红' fmt.Println(string(runeS2)) }
- Go语言中只有强制类型转换,没有隐式类型转换。
-
取地址操作符
&
和取值操作符*
是一对互补操作符,&
取出地址,*
根据地址取出地址指向的值。 -
在Go语言中对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空间,否则我们的值就没办法存储。
-
值类型的声明不需要分配内存空间,是因为它们在声明的时候已经默认分配好了内存空间。
-
new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值。
-
指针作为引用类型需要初始化后才会拥有内存空间,才可以给它赋值。
func main() { var a *int a = new(int) *a = 10 fmt.Println(*a) }
- make也是用于内存分配的,区别于new,它只用于slice、map以及chan的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。(
var b map[string]int
只是声明变量b是一个map类型的变量,需要像下面的示例代码一样使用make函数进行初始化操作之后,才能对其进行键值对赋值)func main() { var b map[string]int b = make(map[string]int, 10) b["沙河娜扎"] = 100 fmt.Println(b) }
- 可变参数是指函数的参数数量不固定。Go语言中的可变参数通过在参数名后加
...
来标识。func intSum3(x int, y ...int) int { fmt.Println(x, y) //y是一个切片 sum := x for _, v := range y { sum = sum + v } return sum }
defer
定义的逆序进行执行,也就是说,先被defer
的语句最后被执行,最后被defer
的语句,最先被执行。func main() { fmt.Println("start") defer fmt.Println(1) defer fmt.Println(2) defer fmt.Println(3) fmt.Println("end") }