func main(){
for i := 1; i <= 100; i++ {
fmt.Println(i)
if i == 14 {
return //结束当前的函数
}
}
fmt.Println("hello golang")
}
八、函数
1.基本语法
func 函数名(形参列表)(返回值类型列表){
执行语句..
return + 返回值列表
}
//自定义函数:功能:两个数相加:
func call01 (num1 int ,num2 int) (int){//如果返回值类型就一个的话,那么()是可以省略不写的
return num1 + num2
}
2.返回多个
省略返回值:
3.不支持重载
Golang中函数不支持重载
4.可变数量的形参
Golang中支持可变参数 (如果你希望函数带有可变数量的参数)
package main
import "fmt"
//定义一个函数,函数的参数为:可变参数 ... 参数的数量可变
//args...int 可以传入任意多个数量的int类型的数据 传入0个,1个,,,,n个
func test (args...int){
//函数内部处理可变参数的时候,将可变参数当做切片来处理
//遍历可变参数:
for i := 0; i < len(args); i++ {
fmt.Println(args[i])
}
}
func main(){
test()
fmt.Println("--------------------")
test(3)
fmt.Println("--------------------")
test(37,58,39,59,47)
}
5.修改数值使用地址传递
基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。
以值传递方式的数据类型,如果希望在函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果来看类似引用传递。
6.函数添加变量名称
在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。
package main
import "fmt"
//定义一个函数:
func test(num int){
fmt.Println(num)
}
func main(){
//函数也是一种数据类型,可以赋值给一个变量
a := test//变量就是一个函数类型的变量
fmt.Printf("a的类型是:%T,test函数的类型是:%T \n",a,test)//a的类型是:func(int),test函数的类型是:func(int)
//通过该变量可以对函数调用
a(10) //等价于 test(10)
}
7.函数作为形参
函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用
(把函数本身当做一种数据类型)
package main
import "fmt"
//定义一个函数:
func test(num int){
fmt.Println(num)
}
//定义一个函数,把另一个函数作为形参:
func test02 (num1 int ,num2 float32, testFunc func(int)){
fmt.Println("-----test02")
}
func main(){
//函数也是一种数据类型,可以赋值给一个变量
a := test//变量就是一个函数类型的变量
fmt.Printf("a的类型是:%T,test函数的类型是:%T \n",a,test)//a的类型是:func(int),test函数的类型是:func(int)
//通过该变量可以对函数调用
a(10) //等价于 test(10)
//调用test02函数:
test02(10,3.19,test)
test02(10,3.19,a)
}
8.自定义数据类型
为了简化数据类型定义,Go支持自定义数据类型
基本语法: type 自定义数据类型名 数据类型
可以理解为 : 相当于起了一个别名
例如:type mylnt int -----》这时mylnt就等价int来使用了.
支持对函数返回值命名
升级写法:对函数返回值命名,里面顺序就无所谓了,顺序不用对应
9.包的引入
不可能把所有的函数放在同一个源文件中,可以分门别类的把函数放在不同的原文件中
1.简单实例
项目结构
main包
db包
2.包的命名
可以给包取别名,
取别名后,原来的包名就不能使用了
10.init函数
init函数:初始化函数,可以用来进行一些初始化的操作
每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用。
11.包执行流程
12.多个包执行流程
13.匿名函数
在定义匿名函数时就直接调用,这种方式匿名函数只能调用一次(用的多)
将匿名函数赋给一个变量(该变量就是函数变量了),再通过该变量来调用匿名函数(用的少)
让一个匿名函数,可以在整个程序中有效呢?将匿名函数给一个全局变量就可以了
package main
import "fmt"
var Func01 = func (num1 int,num2 int) int{
return num1 * num2
}
func main(){
//定义匿名函数:定义的同时调用
result := func (num1 int,num2 int) int{
return num1 + num2
}(10,20)
fmt.Println(result)
//将匿名函数赋给一个变量,这个变量实际就是函数类型的变量
//sub等价于匿名函数
sub := func (num1 int,num2 int) int{
return num1 - num2
}
//直接调用sub就是调用这个匿名函数了
result01 := sub(30,70)
fmt.Println(result01)
result02 := sub(30,70)
fmt.Println(result02)
result03 := Func01(3,4)
fmt.Println(result03)
}
14.闭包
闭包就是一个函数和与其相关的引用环境组合的一个整体
package main
import "fmt"
//函数功能:求和
//函数的名字:getSum 参数为空
//getSum函数返回值为一个函数,这个函数的参数是一个int类型的参数,返回值也是int类型
func getSum() func (int) int {
var sum int = 0
return func (num int) int{
sum = sum + num
return sum
}
}
//闭包:返回的匿名函数+匿名函数以外的变量num
func main(){
f := getSum()
fmt.Println(f(1))//1
fmt.Println(f(2))//3
fmt.Println(f(3))//6
fmt.Println(f(4))//10
}
匿名