golang 包和函数小结
go的每一个文件都是属于一个包的,也就是说go是以包的形式来管理文件和目录结构的
包的作用:
区分相同名字的函数、变量和标识符
当程序文件很多时,可以很好的管理项目
控制函数变量等的访问范围,即作用域
函数说明:
func 函数名(参数列表)(返回值类型列表){
语句。。。
return 返回值列表
}
1.如果返回多个值时,在接受时,可以用_ 表示占位忽略该值
2 如果返回值列表只有一个,返回值类型列表可以不写
3.函数的返回值类型列表,可以提前声明好返回参数名
例如:func get()(a int, b int){...}参数名要么都写,要么都不写
4.在go中,函数也是一种数据类型
func count(n1 int,n2 int)int{
return n1 + n2
}
//函数作为数据类型
f := count
res := f(1,2)
fmt.Printf("1+2=%v\n",res)// 输出1+2=3
5.函数既然是一种数据类型,当然可以作为参数使用
func cal(f func(int,int)int, n1 int,n2 int)int{
return f(n1,n2)
}
//函数作为参数
res = cal(count,10,20)
fmt.Printf("10+20=%v\n",res)// 输出10+20=30
6.可以将func(int,int)int使用type来重定义一个简化的类型名
type funcType func(int,int)int
//func cal(f func(int,int)int, n1 int,n2 int)int{
func cal(f funcType, n1 int,n2 int)int{
return f(n1,n2)
}
7.Go支持可变参数
func(args... interface{}){...}//支持0到多个参数
func(arg0 interface{}.args... interface{}){...}//支持1到多个参数
其中args是切片,可以用for range遍历
func sum(args... int) int{
var res int
for _,v := range args{
res += v
}
return res
}
res = sum(1,2,3,4,5,6,7)
fmt.Println("sum 1-7 is",res) //sum 1-7 is 28
8. 匿名函数使用(定义函数是只想使用一次,那就在需要调用的地方定义)
//匿名函数
res = func(args... int)int{
var res int
for _,v := range args{
res += v
}
return res
}(1,2,3,4,5)
fmt.Println("sum 1-5 is",res) //sum 1-5 is 15
同时也可以作为变量使用
//匿名函数
f2 := func(args... int)int{
var res int
for _,v := range args{
res += v
}
return res
}
fmt.Println("sum 1-5 is",f2(1,2,3,4,5)) //sum 1-5 is 15
9.闭包:闭包就是一个函数和与其相关的应用环境组合的一个整体(实体)
func AddUpper() func(int)int{
var n int = 10 //相当于一个环境变量
return func(x int)int{
n += x
return n
}
}
//闭包使用
f3 := AddUpper()//f3 其实就是AddUpper的返回值的那个函数的实体
/*
n 已经被初始化为10
f3 = func(x int)int{
n += x //每一次调用f3 n就回增加
return n
}
*/
fmt.Println("AddUpper(100)= ",f3(100))//output : AddUpper(100)= 110
fmt.Println("AddUpper(100)= ",f3(100))//output : AddUpper(100)= 210
fmt.Println("AddUpper(100)= ",f3(100))//output : AddUpper(100)= 310

浙公网安备 33010602011771号