一、init()函数
go语言中 init 函数用于包 (package) 的初始化,该函数是go语言的一个重要特性。
1 init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
2 每个包可以拥有多个init函数
3 包的每个源文件也可以拥有多个init函数
4 同一个包中多个init函数的执行顺序go语言没有明确的定义
5不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
6 init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
二、byte和rune类型
go语言有两种字符
1 uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
2 rune类型,代表一个 UTF-8字符。
要修改字符串,需要先将其转换成 []rune或[]byte ,完成后再转换为 string 。无论哪种转换,都会重新分配内存,并复制字节数组。
func main(){
str :="hello"
bytestr := []byte(str)
bytestr[0] = 'H'
fmt.Println(string(bytestr))
str2 := "今天"
runestr2 := []rune(str2)
runestr2[0] = '昨'
fmt.Println(string(runestr2))
}
三、Go语言中的指针
Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。
Go语言中的指针操作非常简单,只需要记住两个符号: & (取地址)和 * (根据地址取值)。
1.指针地址和指针类型
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用&字符放在变量前面对变量进行“取地址”操作。
**Go语言中的值类型 (int、float、bool、string、array、struct) 都有对应的指针类型,如: *int、int64、string 等。
2.指针取值
在对普通变量使用&操作符取地址后会获得这个变量的指针,然后可以对指针使用 * 操作,也就是指针取值
a := 10
b := &a
c := *b // c = 10
总结: 取地址操作符&和取值操作符 * 是一对互补操作符, & 取出地址, * 根据地址取出地址指向的值。
3.空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil
func main() {
var p *string
fmt.Println(p)
fmt.Printf("p的值是%s/n", p)
if p != nil {
fmt.Println("非空")
} else {
fmt.Println("空值")
}
}
<nil>
p的值是%!s(*string=<nil>)/n空值