在B站跟着老韩学习了GO语言,做了一下个人总结,并对代码做了详细的注释,希望能对该部分有疑问的朋友带来一丢丢的帮助,同时欢迎大家指出我说的不对的地方。
今日学习函数特性:
1.在GO中,函数也是一种数据类型,可以赋值给一个变量,该变量就是一个函数类型变量。通过该变量可以调用函数
2.函数可以作为形参,并且调用
3.GO支持自定义数据类型:type 自定义数据类型名 数据类型
4.支持对函数的返回值命名
代码区:
package main
import (
"fmt"
)
func getsum(n1 int,n2 int)int{
return n1+n2
}//取值函数,定义n1 和 n2 为int值,返回的值也是int
//函数规则为 n1+n2
func myFun(funvar myFunType,num1 int,num2 int)int{
//定义funvar变量 为函数变量myFunType 即 func(int,int)int
//即,此时的变量funvar已经成为了一个函数变量,可以适用getsum的规则
return funvar(num1,num2)
//使funvar函数变量可以调用函数
}
type myFunType func(int,int)int
//定义变量myFuntype为函数类型func(int,int)int
func getSumAndSub(n1 int,n2 int)(sum int,sub int){
sum = n1+n2
sub = n1-n2
return
//GO中函数可以给返回值命名
}
func main(){
a := getsum //赋予a为数据类型getsum
fmt.Printf("a的类型%T,getsum是%T\n",a,getsum)
//输出a和getsum的数据类型都为func(int,int)int
//此时的getsum为a的数据类型,因为在go中,函数也是一种数据类型
//通过将函数赋值给一个变量,使得该变量成为一个函数变量
//通过该变量可以调用函数类型
res := a(10,40) //相当于res := getSum(10,40)
//这里的a已经是函数变量了,所以res直接调用getsum函数,进行相加计算
fmt.Println("res=",res)
//输出的为调用gersum函数的值,10+40=50
res2 := myFun(getsum,50,60)
//re2调用函数myfunc,加入getsum函数,是将它传给myfunc中的funvar函数变量
//使得funvar这个函数变量可以调用getsum函数
//计算用getsum函数,50+60
fmt.Println("res2=",res2)
type myInt int
//go支持自定义数据类型
//定义myInt为int
var num1 myInt
num1 = 40
//给int取一个别名,在go中,myint和int虽然都是int类型
//但是go认为,myint和int是两个数据类型
var num2 int
//num2 = myInt X
num2 = int(num1)//将num2设为int类型
//不能直接写num2 = num1,虽然他们都是int类型
//但因为go认为,myint和int在语法上不是同一类型
//所以不能将Myint这个类型直接交给num2
fmt.Println("num1=",num1,"num2=",num2)
res3 := myFun(getsum,500,600)
fmt.Println("res3=",res3)
c,b := getSumAndSub(1,2)
//调用函数getsumandsub,c对应函数中的sum,b对应sub
//1对应函数中的n1,2对应函数中的n2
fmt.Printf("c=%v b=%v\n",c,b)
//输出结果c=3 b=-1
}
与老韩不同的是,我省略了一行函数代码,func2,因为这行代码并没有意义,无论写与不写,对整体代码块没有任何的影响,因为定义的myFunType,在老韩的myFun2里面就是相当于给funvar定义为函数变量func(int,int)int,其实本质跟myFun一样,所以没必要再加这一个myFun2,直接在myFun里面把func(int,int)int换成myFunType,得到的效果一样