Go语言中如何通过方法为类型添加行为

 更新时间:2020年09月08日 08:41:26   作者:huangz/blog  
这篇文章主要介绍了Go语言中如何通过方法为类型添加行为的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

数十年以来, 传统的面向对象语言总是说方法属于类, 但 Go 不是这样做的: 它提供了方法, 但是并没有提供类和对象。 乍一看, 这种做法似乎有些奇怪, 甚至可以说有点儿疯狂, 但实际上 Go 的方法比以往其他语言的方法都要灵活。

使用 kelvinToCelsius 、 celsiusToFahrenheit 、 fahrenheitToCelsius 、 celsiusToKelvin 这样的函数虽然也能够完成温度转换工作, 但是通过声明相应的方法并把它们放置到属于自己的地方, 能够让温度转换代码变得更加简洁明了。

我们可以将方法与同一个包中声明的任何类型相关联, 但是不能为 int 和 float64 之类的预声明类型关联方法。 其中, 声明类型的方法在前面已经介绍过了:

type kelvin float64

kelvin 类型跟它的底层类型 float64 具有相同的行为, 我们可以像处理浮点数那样, 对 kelvin 类型的值执行加法运算、乘法运算以及其他操作。 此外, 声明一个将 kelvin 转换为 celsius 的方法就跟声明一个具有同等作用的函数一样简单——它们都以关键字 func 开头, 并且函数体跟方法体完全一样:

func kelvinToCelsius(k kelvin) celsius {  // kelvinToCelsius 函数
  return celsius(k - 273.15)
}
func (k kelvin) celsius() celsius {  // kelvin 类型的 celsius 方法
  return celsius(k - 273.15)
}

如图 13-1 所示, celsius 方法虽然没有接受任何形参, 但它的名字前面却有一个类似形参的接收者。 每个方法和函数都可以接受多个形参, 但一个方法必须并且只能有一个接收者。 在 celsius 方法体中, 接收者的行为就跟其他形参一样。


图 13-1 方法声明

除声明语法有些许不同之外, 调用方法的语法与调用函数的语法也不一样:

var k kelvin = 294.0
var c celsius

c = kelvinToCelsius(k)   // 调用 kelvinToCelsius 函数
c = k.celsius()  // 调用celsius方法

跟调用其他包中的函数一样, 调用方法也需要用到点记号。 以上面的代码为例, 在调用方法的时候, 程序首先需要给出正确类型的变量, 接着是一个点号, 最后才是被调用方法的名字。

既然温度转换操作现在已经是 kelvin 类型的方法, 那么继续使用 kelvinToCelsius 这样的名字就没有必要了。 在同一个包里面, 如果一个名字已经被函数占用了, 那么这个包就无法再定义同名的类型, 因此在使用函数的情况下, 我们将无法使用 celsius 函数返回 celsius 类型的值。 然而, 如果我们使用的是方法, 那么每种温度类型都可以具有自己的 celsius 方法, 就像以下展示的 fahrenheit 类型一样:

type fahrenheit float64
// celsius方法会将华氏度转换为摄氏度
func (f fahrenheit) celsius() celsius {
return celsius((f - 32.0) * 5.0 / 9.0) }

通过让每种温度类型都具有相应的 celsius 方法以转换为摄氏温度, 我们可以创造出一种完美的对称。

总结

到此这篇关于Go语言中如何通过方法为类型添加行为的文章就介绍到这了,更多相关Go语言通过方法为类型添加行为内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Goland Gin 框架中的表单处理与数据绑定的操作方法

    Goland Gin 框架中的表单处理与数据绑定的操作方法

    本文详细介绍了Gin框架中表单处理的功能,包括数据绑定、验证和文件上传等,并通过一个完整的用户注册项目示例展示了实际应用,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Go语言学习之将mp4通过rtmp推送流媒体服务的实现方法

    Go语言学习之将mp4通过rtmp推送流媒体服务的实现方法

    对音视频一直是小白,决定沉下心来,好好研究一下音视频知识,下面这篇文章主要给大家介绍了关于Go语言学习之将mp4通过rtmp推送流媒体服务的实现方法,需要的朋友可以参考下
    2022-12-12
  • 一文深入探讨Go语言中的if-else语句

    一文深入探讨Go语言中的if-else语句

    在Go语言中,条件语句的使用方式相对简洁明了,所以本文将探讨一下如何在Go程序中有效地进行条件判断和逻辑控制,感兴趣的小伙伴可以了解下
    2023-08-08
  • Golang中使用JSON的一些小技巧分享

    Golang中使用JSON的一些小技巧分享

    这篇文章主要分享了Golang中使用JSON的一些小技巧,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • go-micro使用Consul做服务发现的方法和原理解析

    go-micro使用Consul做服务发现的方法和原理解析

    这篇文章主要介绍了go-micro使用Consul做服务发现的方法和原理,这里提供一个通过docker快速安装Consul的方式,当然前提是你得安装了docker,需要的朋友可以参考下
    2022-04-04
  • 详解如何在Go服务中做链路追踪

    详解如何在Go服务中做链路追踪

    使用 Go 语言开发微服务的时候,需要追踪每一个请求的访问链路,本文主要介绍了如何在Go 服务中做链路追踪,感兴趣的可以了解一下
    2021-09-09
  • 详解Golang time包中的结构体time.Ticker

    详解Golang time包中的结构体time.Ticker

    在日常开发过程中,会频繁遇到对时间进行操作的场景,使用 Golang 中的 time 包可以很方便地实现对时间的相关操作,接下来的几篇文章会详细讲解 time 包,本文讲解一下 time 包中的结构体 time.Ticker,需要的朋友可以参考下
    2023-08-08
  • Go错误处理之panic函数和recover函数使用及捕获异常方法

    Go错误处理之panic函数和recover函数使用及捕获异常方法

    这篇文章主要介绍了Go错误处理之panic函数使用及捕获,本篇探讨了如何使用 panic 和 recover 来处理 Go 语言中的异常,需要的朋友可以参考下
    2023-03-03
  • 安装Sublime Text支持Go插件的方法步骤

    安装Sublime Text支持Go插件的方法步骤

    本文主要介绍了安装Sublime Text支持Go插件的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • golang中日期操作之日期格式化及日期转换

    golang中日期操作之日期格式化及日期转换

    在编程中,程序员会经常使用到日期相关操作,下面这篇文章主要给大家介绍了关于golang中日期操作之日期格式化及日期转换的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11

最新评论