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