Go语言之函数可变参数intit()函数匿名函数和闭包

Posted 程序彤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言之函数可变参数intit()函数匿名函数和闭包相关的知识,希望对你有一定的参考价值。

函数的可变参数

// 可变参数的使用,可变参数必须放在函数的形参列表的末尾
func sum(n1 int,args... int) int{
	sum := n1
	for i:=0;i<len(args);i++{
		sum+=args[i] // 取出切片中第一个元素值
	}
	return sum
}

init函数

utils.go

package utils 

// 这两个全局变量在test2.go中使用
var Age int
var Name string

func init(){
	Age = 23
	Name = "weton"
}

test1.go

package main
import(
	"fmt"
	"go_code/day0514/utils"
)

var age = test()

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


func main(){
	fmt.Println("main()...",age)

	fmt.Println("引入其他utils包的",utils.Age,"Name=",utils.Name)

}

func test() int{
	fmt.Println("先执行全局变量的test()...")
	return 21
}

先执行从外部引的那个包中的变量定义和初始化函数,再执行当前包的变量定义,初始化函数和main函数

匿名函数

func main(){
	fmt.Println("main()...",age)

	fmt.Println("引入其他utils包的",utils.Age,"Name=",utils.Name)

	// 匿名函数,直接被调用
	res1 := func(n1 int,n2 int) int{
		return n1+n2
	}(1,3)
	fmt.Println("res1匿名函数调用一次",res1)

	// 函数也是一种数据类型,变量可不是函数名,这样就实现了在main函数中定义函数。
	a := func(n1 int,n2 int) int{
		return n1-n2
	}
	res2 := a(3,1)
	fmt.Println("a可不是个函数,res2=",res2)
}

闭包

理解:就是函数和只初始化一次的引用变量组成的一个整体,构成了闭包。变量只会被初始化一次,类似全局成员变量,每调用一次,都会在原先上一次的基础之上衔接操作。
优点:
可以把匿名函数引用到的变量保留下来,下一次继续衔接调用。而函数每调用一次都会重新执行一次新的。

package main
import(
	"fmt"
)

func Add() func (int) int{
	var n int = 10
	var str = "go"
	// 返回匿名函数,但是引用到函数外的n
	return func (x int) int{ 
		n=n+x
		str += "a"
		fmt.Println("str=",str)
		return n
	}
}

func main(){
	f:=Add()
	fmt.Println(f(1))
	fmt.Println(f(2)) // 11+2=13
	fmt.Println(f(3)) // 13+3=16
}

以上是关于Go语言之函数可变参数intit()函数匿名函数和闭包的主要内容,如果未能解决你的问题,请参考以下文章

Go语言之函数详解

Go语言系列教程之函数完结篇

Go语言之函数

[Golang]函数详解

golang 碎片整理之 函数

Go语言基础之函数