zoukankan      html  css  js  c++  java
  • init函数和匿名函数

    init函数:

    基本介绍:

      每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在main函数前被调用。

    案例说明:

    //init函数,通常可以在init函数中完成初始化工作
    func init() {
      fmt.Println("init()...")
    }

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

    输出结果:

    细节讨论:

    1)如果一个文件同时包含全局变量定义,init函数和main函数,则执行的流程是变量定义->init函数->main函数

    例子:

    package main
    import (
      "fmt"
    )

    var age int = test()

    //为了看到全局变量是先被初始化的,我们这里先写一个函数来完成初始化
    func test() int {
      fmt.Println("test()")   //1
      return 90
    }

    //init函数,通常可以在init函数中完成初始化工作
    func init() {
      fmt.Println("init()...")   //2
    }

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

    2)init函数最主要的作用,就是完成一些初始化的工作。

    例子:

    package utils
    import "fmt"

    var Age int
    var Name string

    //Age 和 Name 全局变量,我们需要在main.go 使用
    //但是我们需要初始化Age 和 Name

    //init 函数完成初始化工作
    func init() {
      fmt.Println("utils 包的 init()...")
      Age = 100
      Name = "tom~"
    }


    package main
    import (
    "fmt"
    "chapter04/demo7/utils"
    )

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

    func main() {
      fmt.Println("Age = ", utils.Age, "Name = ", utils.Name)
    }

    结果是:

     

    细节讨论:

    3) 面试题:案例如果是main.go 和 utils.go 都含有变量定义,init函数时,执行的流程又是怎么样的呢?

    也就是先执行加载的文件里的变量定义和init函数。

     匿名函数:

    介绍:

      Go支持匿名函数,如果我们某个函数只是希望使用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用


    匿名函数使用方式1:

      在定义匿名函数时就直接调用

      案例:

      func main() {

        //案例演示,求两个数的和,使用匿名函数的方式完成
        res1 := func (n1 int, n2 int) int {
          return n1 + n2
        }(10, 20)         //参数值写在这里
        fmt.Println("res1 = ", res1)
      }

    匿名函数使用方式2:

      将匿名函数赋给一个变量(函数变量),在通过该变量来调用匿名函数

      案例:

      func main() {

        //将匿名函数func (n1 int, n2 int) int 赋给了 a变量
        //则a 的数据类型就是函数类型,此时我们可以通过a完成调用。
        a := func (n1 int, n2 int) int {
          return n1 - n2
        }

        res2 := a(10, 30)
        fmt.Println("res2 = ", res2)
        res3 := a(90, 30)
        fmt.Println("res3 = ", res3)
      }


    全局匿名函数:

      如果将匿名函数赋给一个全局变量,那么这个匿名函数,就成为一个全局匿名函数,可在程序有效。

      例子:

      var (
        //fun1 就是一个全局匿名函数
        fun1 = func (n1 int, n2 int) int {
          return n1 * n2
        }
      )

      func main() {

        //全局匿名函数的使用
        res4 := fun1(4, 9)
        fmt.Println("res4 = ", res4)
      }

  • 相关阅读:
    C#中的语言记忆功能
    C#中 文件的打开及保存
    无边框窗体设置
    Windows获取浏览器中存储的明文密码
    (CVE-2020-17530)Struts2 S2-061漏洞复现
    (CVE-2020-14882​&14883)Weblogic RCE复现
    内网渗透学习-信息收集篇
    Spring Boot Actuator H2 RCE复现
    Linux解压文件
    Windows本地提权
  • 原文地址:https://www.cnblogs.com/green-frog-2019/p/11355048.html
Copyright © 2011-2022 走看看