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()函数匿名函数和闭包的主要内容,如果未能解决你的问题,请参考以下文章