最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

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 intvar num myIntvar num2 intnum = 22num2 = 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)int15 } 

结论:

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

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

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

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

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

关键词: