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

init函数和匿名函数的更多相关文章

  1. PHP中的回调函数和匿名函数

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  2. php中的可变函数和匿名函数

    可变函数 一个函数的名,是一个变量的时候,就称为可变函数 <?php header("content-type:text/html;charset=utf8"); funct ...

  3. Python中的高阶函数与匿名函数

    Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...

  4. python——内置函数和匿名函数

    内置函数 接下来,我们就一起来看看python里的内置函数.截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是python提供给你直接可以拿来使用的所有函数.这 ...

  5. python(day16)内置函数,匿名函数

    # add = lambda x,y:x+y # print(add(1,2)) # dic={'k1':10,'k2':100,'k3':30} # def func(key): # return ...

  6. js中 函数声明/函数表达式/匿名函数/箭头函数/立即执行函数

    函数声明: function add(a, b) { // ... } 1.顾名思义,声明一个函数, 用关键字 “function” 来告诉,这是一个函数. 2.任何地方,想用就可以拿过来使用 函数表 ...

  7. PHP:第三章——PHP中表达式函数和匿名函数

    <?php header("Content-Type:text/html;charset=utf-8"); //表达式函数和匿名函数 /*$A=function(){ ech ...

  8. python之内置函数,匿名函数

    什么是内置函数? 就是Python给你提供的,拿来直接用的函数,比如print,input等等.其实就是我们在创建.py的时候python解释器所自动生成的内置的函数,就好比我们之前所学的作用空间 内 ...

  9. python函数式编程之返回函数、匿名函数、装饰器、偏函数学习

    python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...

随机推荐

  1. Linux安装软件-CentOS和Ubuntu介绍

    开发十年,就只剩下这套架构体系了! >>>   不同Linux发行版的软件安装会有不同的方式,其中CentOS安装软件的主要方式是rpm和yum,Ubuntu可以使用apt-get, ...

  2. Vue+Element-Ui 异步表单效验

    简单的效验 Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名 /* ruleForm :表单绑定的数 ...

  3. mysql的sql语句优化方法面试题总结

    mysql的sql语句优化方法面试题总结 不要写一些没有意义的查询,如需要生成一个空表结构: select col1,col2 into #t from t where 1=0 这类代码不会返回任何结 ...

  4. ideamaven版的MBG逆向工程

    一.简介 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类. 支持基本的增删改查,以及QBC风格的条件查询. 但是表连接.存储 ...

  5. 2018-8-10-C#-ValueTuple-原理

    title author date CreateTime categories C# ValueTuple 原理 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 ...

  6. Maven生成可以直接运行的jar包的多种方式(转)

    转自:https://blog.csdn.net/xiao__gui/article/details/47341385 Maven可以使用mvn package指令对项目进行打包,如果使用java - ...

  7. c# 反射获取属性值 TypeUtils

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...

  8. CSS3 ::before和::after伪元素的实际应用

    实例 1.清除浮动 通常我们清除清除浮动的方式就是在浮动元素后面添加一个空的Div标签,然后在设置它的清除浮动要是,使用after伪元素,我们就不需要添加无意义的div标签在html中了,下面的例子就 ...

  9. 37行代码构建无状态组件通信工具-让恼人的Vuex和Redux滚蛋吧!

    状态管理的现状 很多前端开发者认为,Vuex和Redux是用来解决组件间状态通信问题的,所以大部分人仅仅是用于达到状态共享的目的.但是通常Redux是用于解决工程性问题的,用于分离业务与视图,让结构更 ...

  10. 印度黑客滥用移动设备管理服务MDM监视iPhone用户

    两周前首次亮相的印度高度针对性的移动恶意软件广告系列已被发现是针对多种平台的广泛广告系列的一部分,包括Windows设备,也可能是Android. 在本月早些时候,Talos威胁情报部门的研究人员发现 ...