diff --git a/blog/golang/golang-function.md b/blog/golang/golang-function.md index 108a3b0e4c19050d9945398bb1e40af6c71b19a2..0394df60ca59f29db6fb60c5fb44831982277643 100644 --- a/blog/golang/golang-function.md +++ b/blog/golang/golang-function.md @@ -551,3 +551,95 @@ func main() { } ``` + +## defer语句 + +defer语句后面的语句延迟处理,在defer归属的函数即将返回时,将延迟处理的语句按照defer定义的逆序进行执行 + +也就是说,先定义的defer语句最后执行;后定义的defer语句,先执行 + +defer特性 + +- 关键字defer用于注册延迟调用 +- 这些调用知道return前才被执行,可以用来做资源清理 +- 多个defer语句,按照先进后出的顺序执行 +- defer语句中的变量,defer声明时就决定了 + +defer用途 + +- 关闭文件句柄 +- 锁资源释放 +- 数据库连接释放 + +示例 + +```go +package main + +import "fmt" + +func main() { + fmt.Println("start") + + defer fmt.Println("defer1") + defer fmt.Println("defer2") + defer fmt.Println("defer3") + + fmt.Println("end") + + // start + // end + // defer3 + // defer2 + // defer1 +} + +``` + +## init函数 + +init函数是特殊函数,会先于main函数执行,实现包级别的`初始化操作` + +init函数特点 + +- init函数先于main函数`自动执行`,不能被其他函数调用 +- init函数没有输入参数,没有返回值 +- 每个包可以有多个init函数 +- 包的每个源文件也可以有多个init函数 +- 同一个包的init执行顺序,golang没有明确意义 +- 不同胞的init函数按照包导入的依赖关系决定执行顺序 + + +golang初始化顺序 + +``` +变量初始化 -> init() -> main() +``` + +示例 + +```go +package main + +import "fmt" + +var i int = initVar() + +func initVar() int { + fmt.Println("initVar") + return 100 +} + +func init() { + fmt.Println("init") +} + +func main() { + fmt.Println("main") +} + +// initVar +// init +// main + +``` diff --git a/blog/golang/golang-pointer.md b/blog/golang/golang-pointer.md new file mode 100644 index 0000000000000000000000000000000000000000..d7434acde18793d656681d732572b2baa70d6f46 --- /dev/null +++ b/blog/golang/golang-pointer.md @@ -0,0 +1,88 @@ +# Golang 指针 + +## 指针 + +- 取地址:`&` +- 取值:`*` + + +指针地址:每一个变量都有一个地址,地址代表变量在内存中的位置 + +Go语言中的值类型(int、float、bool、string、array、struct) + +对应的指针类型(*int、*int64、*string) + +指针变量定义语法 + +```go +// 指针变量名 指针类型 +var var_name *var_type +``` + +示例 + +```go +package main + +import "fmt" + +func main() { + // 声明指针变量 + var ip *int + fmt.Printf("%v\n", ip) // + fmt.Printf("%T\n", ip) // *int + + // 声明int变量 + var i int = 10 + + // 取地址 + ip = &i + + fmt.Printf("%v\n", ip) + // 0xc0000ae010 + + // 取值 + fmt.Printf("%v\n", *ip) + // 10 +} + +``` + +## 指向数组的指针 + +定义语法 + +```go +// 表示数组里面的元素类型是指针类型 +var ptr [MAX]*int; +``` + +示例 + +```go +package main + +import "fmt" + +func main() { + arr := [...]int{1, 2, 3} + var ptr [len(arr)]*int + + fmt.Printf("%v\n", ptr) + // [ ] + + for i := 0; i < len(arr); i++ { + ptr[i] = &arr[i] + } + + fmt.Printf("%v\n", ptr) + // [0xc000022090 0xc000022098 0xc0000220a0] + + for i := 0; i < len(ptr); i++ { + fmt.Printf("%v\t", *ptr[i]) + } + // 1 2 3 +} + +``` + diff --git a/blog/golang/index.md b/blog/golang/index.md index 2d0cb158706c9b40c472728f8b06cb82b198910f..b65e1ab4b8cdb17205cc6424a0e7848630f5f504 100644 --- a/blog/golang/index.md +++ b/blog/golang/index.md @@ -38,9 +38,12 @@ [第十五章 Golang 函数](/blog/golang/golang-function.md) +[第十六章 Golang 指针](/blog/golang/golang-pointer.md) + https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da -https://www.bilibili.com/video/BV1zR4y1t7Wj?p=45&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file + +https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=49&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file