Go基础知识点(五) | 青训营笔记

45 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第7天.

函数变量的作用域:

局部变量:函数内部定义的变量,叫做局部变量;

全局变量:函数外部定义的变量,叫做全局变量.

局部变量,就近原则.

递归函数:

import "fmt"

func main() {
   sum := getsum(5)
   fmt.Println(sum)
}
func getsum(n int) int {
   if n == 1 {
      return 1
   }
   return getsum(n-1) + n   //结果: 15
}

defer:

defer语义:推迟,延迟

在go语言中,使用defer关键字来延迟一个函数或方法的执行.

defer函数或者方法:一个函数或方法的执行被延迟了.

  • 你可以在函数中添加多个defer语句,当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回,特别是当你在进行一些打开资源的操作时,遇到错误需要提前返回,在返回前你需要关闭相应的资源,不然很容易造成资源泄露等问题.

  • 如果有很多调用defer,那么defer是采用先进后出(栈)模式.

import "fmt"

func main() {
   fmt.Println(1)
   defer f(2) //会被延迟到最后执行
   fmt.Println(3)
   fmt.Println(4)
   defer f(5)  //会被延迟到最后执行
   fmt.Println(6)
   defer f(7)  //会被延迟到最后执行
   defer f(8)  //会被延迟到最后执行
}
func f(num int) {
   fmt.Println(num)
}
image.png

函数本质的探讨:

import "fmt"

// func()本身就是一个数据类型
func main() {
   //f1 如果不加括号,函数就是一个变量
   //f1 如果加括号,就是函数的调用
   fmt.Printf("%T\n", f1)

   //定义函数类型的变量
   var f5 func(int, int)
   f5 = f1 //引用类型的
   fmt.Println(f1)
   fmt.Println(f5)
   f5(1, 2)
}

func f1(a, b int) {
   fmt.Println(a, b)
}
image.png

函数在Go语言中是复合类型,可以看做是一种特殊的变量.

函数():调用返回结果

函数名:指向函数体的内存地址,一种特殊类型的指针变量.

晚安啦~ 今天的学习就到这里.

加油,努力,打工人!