init
用于初始化
执行顺序:全局变量定义-》init函数执行-》main函数执行
如果全局变量定义的同时用一个函数赋值,该函数最先执行
作用举例:
需求:main.go要用到另一个包里的文件,utils.go
utils.go
package utils
var Age int
var Name string
//希望在mian用,但是需要初始化
func init(){
Age = 10
Name = "Tom"
}
main.go
package main
import (
"fmt"
"project1/util"
)
func main(){
fmt.Println("maindemo",util.Age)
}
执行顺序:util.go的变量定义-》util.go的init()-》main.g变量定义-》init()-》main()
如果util.go再引用了其他文件,先执行其他文件
匿名函数
定义的时候直接调用
ret:= func(n1 int, n2 int) int{
return n1+n2
}(10,20)
赋给一个变量,通过变量调用(可多次调用)
通过这种方式可以在函数里面定义函数,这种方法用的不多
f := func(n1 int, n2 int) int{
return n1-n2
}
ret :=a(10,5)
f不是函数名!
全局匿名函数
可以在整个程序中调用
var(
Fun1=func (n1 int, n2 int) int{
return n1*n2
}
)
闭包
一个函数与其相关的引用环境组成的整体
//累加器
func AddUper() func (int) int{
var n int = 10
return func (x int ) int {
n = n+x
return n
}
}
func main(){
f := AddUper()
print(f(1))//10+1
print(f(2))//10+1+2
- 返回的是一个函数,但是这个函数引用了外面的n,因此这个函数和n构成整体,即闭包
- 可以这样理解:闭包是一个类,函数是操作,n是字段。
- 反复调用f函数时,n只有第一次会初始化,
func makeSuffix(suffix string) func ( string)(string){
return func(name string)(ret string){
if !strings.HasSuffix(name, suffix){
return name+suffix
}
return name
}
}
//判断字符串name是否以suffix结尾,如果不是就在name后加上suffix
//suffix和匿名函数构成闭包
如果使用传统的方法,每一次调用都要传入两个参数 ,假如要判断多个字符串是否以jpg结尾,比较麻烦。
使用闭包,会保留上次引用的值(n和suffix),一次传入,反复使用