首页 > 其他分享 >Go中init函数和匿名函数

Go中init函数和匿名函数

时间:2024-01-15 11:12:57浏览次数:30  
标签:函数 fmt init 匿名 func Go main

init函数:

每一个源文件中都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是init会在Main函数之前被调用。通常可以在init函数中完成初始化工作。

import "fmt"

func main() {
	fmt.Println("main函数")//后输出
}

func init() {
	fmt.Println("init方法")//先输出
}

细节说明:

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

import "fmt"

// 变量定义
var age = test()

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

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

func init() {
	fmt.Println("init方法")
}

//输出内容
//test函数
//init方法
//main函数,age= 90

  1. init函数最主要的作用就是完成一些初始化工作。
package utils

var Age int
var Name string

// 初始化Age和Name  这样其他文件就可以直接用其变量了
func init() {
	Age = 100
	Name = "tom"
}
  1. 如果A文件到入了B文件,都含有全局变量,init函数,那么执行流程是怎么样的?

匿名函数:
匿名函数就是没有名字的函数,如果我们某个函数只是希望调用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用。

使用方式1:在定义的时候就直接调用,这种方式的匿名函数只能调用一次。

package main

import "fmt"

func main() {
	//求两个数之和,匿名函数
	result := func(n1 int, n2 int) int {
		return n1 + n2
	}(10, 20)

	fmt.Println("result:", result)//30
}

使用方式2:将匿名函数赋值给一个变量,再通过该变量来调用匿名函数。

package main

import "fmt"

func main() {
    //把匿名函数赋值给变量a
	a := func(n1 int, n2 int) int {
		return n1 - n2
	}
    //注意a不是函数名,可以调用多次
	result2 := a(10, 7)
	fmt.Println("result2:", result2)//3
}

全局匿名函数:
如果我们把匿名函数赋值给一个全局变量,那么这个匿名函数就是一个全局匿名函数,可以在整个程序中有效。

package main

import "fmt"

var (
	//func1就是一个全局匿名函数
	func1 = func(n1 int, n2 int) int {
		return n1 * n2
	}
)
func main() {
    //使用全局匿名函数
    result3 := func1(4, 9)
	fmt.Println("result3:", result3) //36
}

标签:函数,fmt,init,匿名,func,Go,main
From: https://www.cnblogs.com/mafu-blogs/p/17964842

相关文章

  • SQL中的power()函数
    SQL中的POWER()函数用于计算一个数的指数。它的语法通常如下:POWER(base,exponent)其中base是基数,exponent是指数。使用场景指数计算:当你需要计算一个数的指数时,可以使用POWER()函数。快速计算幂:如果你需要多次计算同一个数的不同幂,使用POWER()函数可以减少计算量。生成连......
  • Redis、Memcache和MongoDB的区别
    Redis、Memcache和MongoDB的区别 >>MemcachedMemcached的优点:Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。支持直接配置为sessionhandle。Memcached的......
  • elixir before_compile && on_definition 简单使用
    elixir提供了一些方便的模块属性,可以让我们方便的进行elixir的扩展(尤其是进行元编程的时候)比如elixir_agent就使用到了before_compile以及on_definition,方便进行trace的处理on_definition的简单使用参考demo内容来自官方,可以实现输出函数的一些信息 defm......
  • Go Lang 异常处理
    C#,JAVA等语言通过try...catch...finally实现错误的捕获和处理GoLang异常处理的设计思想中主张如果一个函数可能出现异常,那么应该把异常作为返回值,没有异常就返回nil每次调用可能出现异常的函数时,都应该主动进行检查,并做出反应,这种 if 卫述语句所以异常应该总是掌握在......
  • LLM模型的generate和chat函数区别
      在HuggingFace的transformers库中,GPT(GenerativePre-trainedTransformer)类的模型有两个常用的生成文本的方法:generate和chat。这两个方法在使用上有一些区别。通常公司发布的LLM模型会有一个基础版本,还会有一个Chat版本。比如,Qwen-7B(基础版本)和Qwen-7B-Chat(Chat......
  • go-micro 简介
    1.go-micro简介GoMicro是一个插件化的基础框架,基于此可以构建微服务,Micro的设计哲学是可插拔的插件化架构在架构之外,它默认实现了consul作为服务发现(2019年源码修改了默认使用mdns),通过http进行通信,通过protobuf和json进行编解码2.go-micro的主要功能服务发现:自动服务注......
  • Django 源码分析(一):命令分析
    Django源码分析(一):命令分析说明:本部分主要介绍Django程序在开发中常用的命令是如何控制生成的进行解析;1.分析入口启动命令:pythonmanage.pyrunserver127.0.0.1:8000项目启动的时候执行的manage.py脚本,相关代码如下:"""Django'scommand-lineutilityforadministrat......
  • Django 源码分析(二):wsgi & asgi
    Django源码分析(二):wsgi&asgi说明:上一节主要讲述了django项目的启动,后期主要会根据django请求的生命周期进行分析;参考文章:https://zhuanlan.zhihu.com/p/95942024参考文章:https://zhuanlan.zhihu.com/p/269456318附:生命周期参考图;第一步:浏览器发起请求补充:第一步和第......
  • Django 请求到来与路由匹配
    Django请求到来与路由匹配说明:本部分主要讲述请求到来与路由匹配的部分;1.请求到来上次分析到了wsgi的函数内部处理信息,我们已经知道请求到了之后会执行__call__方法,下面将继续分析__call__方法。classWSGIHandler(base.BaseHandler):#继承BaseHandlerrequest......
  • Django 源码(三)-应用 & 中间件 & 配置文件
    Django源码(三)-应用&中间件&配置文件本部分主要是在为程序启动时候加载应用以及中间件的信息;1.应用的加载在程序启动的部分,我们分析到程序执行的时候都会执行一个setup()函数,相关的内容可以看之前的章节的部分;defsetup(set_prefix=True):"""Configurethes......