Go-自定义数据类型(函数类型)详解
前提:为了简化数据类型,go支持自定义数据类型
基本语法:
type 自定义数据类型名 数据类型 //相当于取一个别名
eg: type myint int //这时myint就等价于int来使用了
eg:type mySum func(int, int) int /这时mySum就等价一个函数类型func(int, int) int
//给int取一个别名,在go中,myInt和int虽然都是int类型,但go认为myInt和int是两个类型 type myInt int var num myInt var num2 int num = 22 num2 = int(num) //注意:这里依然需要显示转换,go认为myInt和int是两个类型 fmt.Printf("num的值为%v, num2的值为%v\n", num, num2)
问题描述:由上可知,既然go认为myInt和int是两个类型,那么下面定义的myfunc与func(int,int)int也是两个类型。
那么在使用myfunc作为形参类型时,为什么在传参数a的时候不提示参数类型不匹配??
1 type myfunc func(int,int)int //自定义函数数据类型 2 3 func sum(n int,m int) int{ 4 return n+m 5 } 6 7 func sum2(funvar myfunc, a int, b int )int{ //作为形参funvar函数类型为myfunc 9 return funvar(a,b) 10 } 11 func main(){ 12 a :=sum 14 fmt.Printf("a+b=%d\n",sum2(a,1,2)) //所传递的 a的数据类型为func(int,int)int 15 }
原因:
在Go语言中,函数类型的参数是一种抽象的类型,它描述了函数的签名(参数类型和返回类型),而不是具体的函数实现。因此,在声明函数类型时并不会指定参数的具体类型。
当定义一个函数类型 myfunc
为 func(int, int) int
时,它表示该函数类型接受两个 int
类型的参数,并返回一个 int
类型的结果。这个类型可以用来声明变量或作为函数的参数或返回值。
然而,当你使用函数类型 myfunc
的变量或将其作为参数传递时,编译器并不会对参数的具体类型进行检查。这是因为函数类型是一种抽象的概念,可以被用于表示多个具体类型的函数。
例如,你可以将满足相同签名的具体函数赋值给 myfunc
类型的变量,因为它们的参数和返回类型匹配。编译器只会检查函数类型的签名是否匹配,而不会进一步检查参数的具体类型。
因此,在传递参数时,Go编译器不会提示参数类型不同的错误,因为函数类型的参数是抽象的,可以接受多种具体类型的函数。如果你需要确保传递的参数类型与函数类型的参数匹配,你需要在代码中进行显式的类型检查和转换。