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语言中,函数类型的参数是一种抽象的类型,它描述了函数的签名(参数类型和返回类型),而不是具体的函数实现。因此,在声明函数类型时并不会指定参数的具体类型。

当定义一个函数类型 myfuncfunc(int, int) int 时,它表示该函数类型接受两个 int 类型的参数,并返回一个 int 类型的结果。这个类型可以用来声明变量或作为函数的参数或返回值。

 

  然而,当你使用函数类型 myfunc 的变量或将其作为参数传递时,编译器并不会对参数的具体类型进行检查。这是因为函数类型是一种抽象的概念,可以被用于表示多个具体类型的函数。

 

  例如,你可以将满足相同签名的具体函数赋值给 myfunc 类型的变量,因为它们的参数和返回类型匹配。编译器只会检查函数类型的签名是否匹配,而不会进一步检查参数的具体类型。

因此,在传递参数时,Go编译器不会提示参数类型不同的错误,因为函数类型的参数是抽象的,可以接受多种具体类型的函数。如果你需要确保传递的参数类型与函数类型的参数匹配,你需要在代码中进行显式的类型检查和转换。

 

posted @ 2023-06-24 09:49  图兜  阅读(63)  评论(0编辑  收藏  举报