Go语言中如何通过方法为类型添加行为
前言
数十年以来,传统的面向对象语言总是说方法属于类,但Go不是这样做的:它提供了方法,但是并没有提供类和对象。乍一看,这种做法似乎有些奇怪,甚至可以说有点儿疯狂,但实际上Go的方法比以往其他语言的方法都要灵活。
使用kelvinToCelsius、celsiusToFahrenheit、fahrenheitToCelsius、celsiusToKelvin这样的函数虽然也能够完成温度转换工作,但是通过声明相应的方法并把它们放置到属于自己的地方,能够让温度转换代码变得更加简洁明了。
我们可以将方法与同一个包中声明的任何类型相关联,但是不能为int和float64之类的预声明类型关联方法。其中,声明类型的方法在前面已经介绍过了:
typekelvinfloat64
kelvin类型跟它的底层类型float64具有相同的行为,我们可以像处理浮点数那样,对kelvin类型的值执行加法运算、乘法运算以及其他操作。此外,声明一个将kelvin转换为celsius的方法就跟声明一个具有同等作用的函数一样简单——它们都以关键字func开头,并且函数体跟方法体完全一样:
funckelvinToCelsius(kkelvin)celsius{//kelvinToCelsius函数 returncelsius(k-273.15) } func(kkelvin)celsius()celsius{//kelvin类型的celsius方法 returncelsius(k-273.15) }
如图13-1所示,celsius方法虽然没有接受任何形参,但它的名字前面却有一个类似形参的接收者。每个方法和函数都可以接受多个形参,但一个方法必须并且只能有一个接收者。在celsius方法体中,接收者的行为就跟其他形参一样。
图13-1方法声明
除声明语法有些许不同之外,调用方法的语法与调用函数的语法也不一样:
varkkelvin=294.0 varccelsius c=kelvinToCelsius(k)//调用kelvinToCelsius函数 c=k.celsius()//调用celsius方法
跟调用其他包中的函数一样,调用方法也需要用到点记号。以上面的代码为例,在调用方法的时候,程序首先需要给出正确类型的变量,接着是一个点号,最后才是被调用方法的名字。
既然温度转换操作现在已经是kelvin类型的方法,那么继续使用kelvinToCelsius这样的名字就没有必要了。在同一个包里面,如果一个名字已经被函数占用了,那么这个包就无法再定义同名的类型,因此在使用函数的情况下,我们将无法使用celsius函数返回celsius类型的值。然而,如果我们使用的是方法,那么每种温度类型都可以具有自己的celsius方法,就像以下展示的fahrenheit类型一样:
typefahrenheitfloat64 //celsius方法会将华氏度转换为摄氏度 func(ffahrenheit)celsius()celsius{ returncelsius((f-32.0)*5.0/9.0)}
通过让每种温度类型都具有相应的celsius方法以转换为摄氏温度,我们可以创造出一种完美的对称。
总结
到此这篇关于Go语言中如何通过方法为类型添加行为的文章就介绍到这了,更多相关Go语言通过方法为类型添加行为内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。