Go语言中如何通过方法为类型添加行为
作者:huangz/blog 发布时间:2024-01-31 18:02:10
前言
数十年以来, 传统的面向对象语言总是说方法属于类, 但 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 方法以转换为摄氏温度, 我们可以创造出一种完美的对称。
来源:https://blog.huangz.me/2020/type-method-in-go.html
猜你喜欢
- 而每次查询分析器寻找路径时,并不会每一次都去统计索引中包含的行数,值的范围等,而是根据一定条件创建和更新这些信息后保存到数据库中,这也就是所
- import osimport sysimport ftplibimport socket#########################
- 曾有位网友遇到这样一个问题:产品名称为“A&T Plastic”,在产品列表中需要做这样的超链接,<a href="
- 前记在Python中, Dict是一系列由键和值配对组成的元素的集合, 它是一个可变容器模型,可以存储任意类型对象. Dict的存取速度非常
- 在基于 Git 的开发过程中,我们很容易遇到合并代码的情况,例如我们从 master 分支拉取了一个 feature 分支,当我们开发到一段
- 本文实例讲述了Python PyAutoGUI模块控制鼠标和键盘实现自动化任务。分享给大家供大家参考,具体如下:PyAutoGUI是用Pyt
- 循环是我们经常用到的一个概念,比如,循环计算数字叠加、循环输出文字内容等。循环是运行重复内容的一个最简单的方法,简化了代码流程,增加了时效性
- 概述for循环是一个循环控制结构,可以执行指定次数的循环语法第一种for {} //无线循环第二种for 条件语
- 使用pip安装Django时报错,先是:C:\Users\admin>pip install django Collecting dj
- torch.nn.BatchNorm1d()1、BatchNorm1d(num_features, eps = 1e-05, momentu
- 一、闭包闭包从形式上来说是在外部函数中定义内部函数,并且内部函数引用了外部函数的变量,此变量叫做自由变量。或者说是将组成函数的语句和这些语句
- js部分setInterval("time_controller()",1000);function time_cont
- 网上看到一个python写的数独,很好玩,分享给大家。import randomimport itertoolsfrom copy impo
- 使用MySQL进行数据库备份,有很正规的数据库备份方法,同其他的数据库服务器有相同的概念,但有没有想过,MySQL会有更简捷的使用文件目录的
- 目录Counter举例实战sortedallF-strings总结Python中冷门但非常好用的内置函数 Counter举例 实战sorte
- 最近看了下go发送smtp邮件,于是总结一下简单示例 先上一个最简单的代码 (网上搂的代码改了改)package mainimport (
- Python 文件操作的详解及实例一、文件操作1、对文件操作流程打开文件,得到文件句柄并赋值给一个变量通过句柄对文件进行操作关闭文件现有文件
- Python则是通过缩进来识别代码块的。缩进Python最具特色的是用缩进来标明成块的代码。我下面以if选择结构来举例。if后面跟随条件,如
- python实现银行管理系统,供大家参考,具体内容如下有的地方用的方法的比较复杂,主要是为回顾更多的知识test1用来存类和函数#test1
- 1. 问题抓取某个网站,发现请求参数是乱码格式,这是点击 TextView,发现请求参数如下图所示3. 那么=%B9%FA%CE%F1%D4