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)
  }

最新文章

  1. Blink, 通向哈里·波特的魔法世界
  2. Winform 导入导出方法
  3. AngularJs form.FormController、ngModel.NgModelController
  4. 打包文件 MANIFEST.MF 功能详解
  5. bootstrap弹出提示窗口功能
  6. 如何使CSS3中的animation动画当每滑到一屏时每次都运行
  7. Nginx学习笔记(六) 源码分析&启动过程
  8. C++内嵌汇编代码,简单文件加密
  9. 流媒体学习三-------SIP消息结构详解
  10. 【C#学习笔记】调用C++生成的DLL
  11. flex数据交互方式 转
  12. 0xc000000f: Error attempting to read the boot configuration data
  13. 麻瓜之我要学sql,啦啦啦啦
  14. 关于 JavaScript 中的继承
  15. topcoder srm 702 div1 -3
  16. C#窗体布局技巧
  17. 【转】每天一个linux命令(19):find 命令概览
  18. 【Cf #503 C】Sergey's problem(有趣的构造)
  19. php输出日志的实现
  20. Tomcat性能监控

热门文章

  1. CtfStudying之SSH私钥泄露
  2. 【leetcode】486. Predict the Winner
  3. 英语单词omitting
  4. Ubuntu系统安装两个tomcat
  5. 【テンプレート】LCA
  6. Hash树——数据结构
  7. Yii 1.1 常规框架部署和配置
  8. Oracle Data Guard Protection Modes
  9. 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录
  10. 深入RESTful无状态原则