init函数和匿名函数|Go笔记

90 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

文章概览

  • init函数
  • 匿名函数

init函数

 每一个源文件都可以有一个init函数,这个函数会在主函数执行前被电泳,这是由Go运行框架决定的。

示例

package main

import "fmt"

func init(){
fmt.Println("main init")
}

func main(){
fmt.Println("main")
}

示例2

package main

import "fmt"

var age = test()

func test() int{
   fmt.Println("test")//1
   return 11
}

func init(){
   fmt.Println("init()")//2
}

func main() {
   fmt.Println("main()...age=",age)
}

注意

  • 全局变量最先被初始化
  • 一般可以在init函数中完成初始化工作。

匿名函数

 一个函数,假如只需要使用一次,那么匿名函数是不错的选择,在Go中支持匿名函数的使用,同时匿名函数也可以被多次调用。

匿名函数的使用方法1

 可以在定义匿名函数的同时直接调用。

匿名函数的使用方式2

 为了实现匿名函数的多次使用,可以把匿名函数赋值给变量,然后就可以通过这个变量来使用匿名函数。

全局匿名函数

 假如把这个变量赋值给一个全局变量,那么匿名函数就拥有了全局变量的特性,可以在程序多个地方使用。

defer的基本使用

 在函数中,程序员经常需要创建资源(比如数据库连接、文件句柄、锁定等),为了在函数执行完毕后,及时释放资源,就需要用到defer。

func test()(x int)  {
    x = 10
    defer func() {
    	x++
    }()
    return x
}

注意

  • 当go执行到一个defer时,不会立即执行defer后面的语句,而是将defer后的语句压入到一个栈中,然后继续执行下一个语句。
  • 在函数执行完成后,从defer栈中将语句一次提取出来执行(从栈中取数据遵循先入后出的机制)。
  • 将defer放入栈中时,会将defer语句的相关值一起拷贝到栈中。