go补充

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
  1. 返回的是一个函数,但是这个函数引用了外面的n,因此这个函数和n构成整体,即闭包
  2. 可以这样理解:闭包是一个类,函数是操作,n是字段。
  3. 反复调用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),一次传入,反复使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值