go语言方法之方法声明

        从我们的理解来讲,一个对象其实也就是一个简单的赋值或者一个变量,在这个对象中会包含一些方法,而一个方法则是一个一个和特殊类型关联的函数。一个面向对象的程序会用方法来表达其属性和对应的操作,这样使用这个对象的用户就不需要直接去操作对象,而是借助方法来做这些事情。

        在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。

package mainimport ("fmt""math"
)type Point struct{ X, Y float64 }// traditional function
func Distance(p, q Point) float64 {return math.Hypot(q.X-p.X, q.Y-p.Y)
}// same thing, but as a method of the Point type
func (p Point) Distance(q Point) float64 {return math.Hypot(q.X-p.X, q.Y-p.Y)
}func main() {p := Point{1, 2}q := Point{4, 6}fmt.Println(Distance(p, q)) fmt.Println(p.Distance(q))  
}5
5Process finished with the exit code 0

 

        上面的代码里面有个附加参数p,叫做方法的接收器(receiver),早期的面向对象语言留下的遗产将调用一个方法称为“向一个对象发送消息”。

        在Go语言中,我们并不会像其他语言那样用this或者self作为接收器,我们可以任意的选择接收器的名字。由于接收器的名字经常会被使用到,所以保持其在方法间传递的一致性和简短性是不错的主意。这里的建议是可以使用其类型的第一个字母,比如这里使用了Point的首字母p。

        在方法调用过程中,接收器参数一般会在方法名之前出现。这种方法声明是一样的,都是接收器参数在方法名字之前。

        上图中的两个函数都是调用的distance,但是却没有发生冲突。第一个distance的调用实际上用的是包级别的函数main.Distance,而第二个则是使用刚刚声明的Point,调用的是Point类下声明的Point.Distance方法。

        这种p.Distance的表达式叫做选择器,因为他会选择合适的对应p这个对象的Distance方法来执行。选择器也会被用来选择一个struct类型的字段,比如p.X。由于方法和字段都是在同一命名空间,所以如果我们在这里声明一个X方法的话,编译器会报错,因为在调用p.X时会有歧义。

        因为每种类型都有其他方法的命名空间,我们在用Distance这个名字的时候,不同的Distance调用指向了不同类型的Distance方法。让我们来定义一个Path类型,这个Path代表一个线段 的集合,并且也给这个Path定义一个叫Distance的方法。

        

// A Path is a journey connecting the points with straight lines.
type Path []Point
// Distance returns the distance traveled along the path.
func (path Path) Distance() float64 {sum := 0.0for i := range path {if i > 0 {sum += path[i-1].Distance(path[i])}}return sum
}

        Path是一个命名的slice类型,而不是Point那样的struct类型,然而我们依然可以为它定义方法。在能够给任意类型定义方法这一点上,Go和很多其它的面向对象的语言不太一样。因此 在Go语言里,我们为一些简单的数值、字符串、slice、map来定义一些附加行为很方便。方法可以被声明到任意类型,只要不是一个指针或者一个interface。

        两个Distance方法有不同的类型。他们两个方法之间没有任何关系,尽管Path的Distance方法 会在内部调用Point.Distance方法来计算每个连接邻接点的线段的长度。 让我们来调用一个新方法,计算三角形的周长:

perim := Path{{1, 1},{5, 1},{5, 4},{1, 1},
}
fmt.Println(perim.Distance()) // "12"

        在上面两个对Distance名字的方法的调用中,编译器会根据方法的名字以及接收器来决定具体 调用的是哪一个函数。第一个例子中path[i-1]数组中的类型是Point,因此Point.Distance这个 方法被调用;在第二个例子中perim的类型是Path,因此Distance调用的是Path.Distance。 Go语言圣经 方法声明 211 对于一个给定的类型,其内部的方法都必须有唯一的方法名,但是不同的类型却可以有同样 的方法名,比如我们这里Point和Path就都有Distance这个名字的方法;所以我们没有必要非 在方法名之前加类型名来消除歧义,比如PathDistance。这里我们已经看到了方法比之函数 的一些好处:方法名可以简短。当我们在包外调用的时候这种好处就会被放大,因为我们可 以使用这个短名字,而可以省略掉包的名字,下面是例子:

import "gopl.io/ch6/geometry"perim := geometry.Path{{1, 1}, {5, 1}, {5, 4}, {1, 1}}
fmt.Println(geometry.Path.Distance(perim)) // "12", standalone function
fmt.Println(perim.Distance()) // "12", method of geometry.Path

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos6下面用yum安装php7.3

首先安装remi.repo 仓库 参考: centos yum方式安装PHP74 centos yum方式安装PHP74_yum 安装php74-CSDN博客 yum安装 yum install php73-php-pecl-zip bz2 curl event gd json openssl mysqlnd PDO yum install php-posix php73 composer.phar config -g repo.packagist co…

AI大模型在测试中的深度应用与实践案例

文章目录 1. 示例项目背景2. 环境准备3. 代码实现3.1. 自动生成测试用例3.2. 自动化测试脚本3.3. 性能测试3.4. 结果分析 4. 进一步深入4.1. 集成CI/CD管道4.1.1 Jenkins示例 4.2. 详细的负载测试和性能监控4.2.1 Locust示例 4.3. 测试结果分析与报告 5. 进一步集成和优化5.1. …

IND-ID-CPA 和 IND-ANON-ID-CPA Game

Src: https://eprint.iacr.org/2017/967.pdf

算法训练 | 二叉树Part5 | 513.找树左下角的值、112.路径总和、106.从中序与后序遍历序列构造二叉树

目录 513.找树左下角的值 递归法 迭代法 ⭐ 112.路径总和 递归法 迭代法 106.从中序与后序遍历序列构造二叉树 递归法 513.找树左下角的值 题目链接:513. 找树左下角的值 - 力扣(LeetCode) 文章讲解:programmercarl.com…

超声波清洗机哪些品牌好用点?四大极其出色的机型一目了然

各位眼镜侠们,在佩戴眼镜的是,有没有觉得眼镜总是有些难以言喻的“味道”或者是污渍在镜片上面。是的,没有猜错,那是我们脸上油脂、汗液和各种不明物质的混合体。特别是在夏天的时候天气太炎热会经常出汗,眼镜上会沾染…

2021职称继续教育--加快构建完整内需体系,形成国内国际双循环相互促进新格局

单选题(共7题,每题5分) 1、根据本讲,突破和推进“一带一路”战略,要满足以企业为主体、以()为导向的基本要求。 D、市场 2、根据本讲,让农村消费市场持续扩张的前提(&am…

shell将文件分割成小块文件

背景&#xff1a;某软件最多支持1G的文件传输&#xff0c;需要对大文件进行切割。 方案1&#xff1a; 可以使用split命令将文件均分成10分片。以下是具体的命令示例&#xff1a; split -b $(($(du -b < 文件名) / 10)) 文件名 分片前缀 这里文件名是你想要分割的文件的名…

网络架构三层到大二层的对比和选择

在企业的网络结构选择中&#xff0c;有二层网络和三层网络结构两种选择。三层是按照逻辑拓扑结构进行的分类&#xff0c;汇聚层和接入层&#xff0c;流量纵向经过接入层、汇聚层网络&#xff0c;收敛至骨干核心层。二层网络结构没有汇聚层。大二层网络架构通常使用VLAN&#xf…

上海冠珠旗舰总店盛装开业暨冠珠瓷砖中国美学设计巡回圆满举办

上海&#xff0c;这座融合了东西方文化的国际化大都市&#xff0c;不仅是中国的时尚中心&#xff0c;也是全球潮流的汇聚地。在这里&#xff0c;古典与现代交织&#xff0c;传统与前卫并存&#xff0c;为传统色彩与现代设计的融合提供了得天独厚的条件。 5月25日&#xff0c;上…

JWT-登录后下发令牌

后端 写一个jwt工具类&#xff0c;处理令牌的生成和校验&#xff0c;如&#xff1a; 响应数据样例&#xff1a; 前端要做的&#xff1a;

ts 中的 type 和 interface 有什么区别?

一、用法举例 interface Person {name: stringage: number }const person: Person {name: Kite,age: 24 }type Person {name: stringage: number }const person: Person {name: Kite,age: 24 }二、翻阅 ts 的官方文档&#xff1a; 1、interface 接口 TypeScript的核心原则…

Weblogic SSRF漏洞 [CVE-2014-4210]

漏洞复现环境搭建请参考 http://t.csdnimg.cn/svKal docker未能成功启动redis请参考 http://t.csdnimg.cn/5osP3 漏洞原理 Weblogic的uddi组件提供了从其他服务器应用获取数据的功能并且没有对目标地址做过滤和限制&#xff0c;造成了SSRF漏洞&#xff0c;利用该漏洞可以向内…

【AJAX前端框架】Asynchronous Javascript And Xml

1 传统请求及缺点 传统的请求都有哪些&#xff1f; 直接在浏览器地址栏上输入URL。点击超链接提交form表单使用JS代码发送请求 window.open(url)document.location.href urlwindow.location.href url… 传统请求存在的问题 页面全部刷新导致了用户的体验较差。传统的请求导…

安泰电子:高压功率放大器应用场合介绍

高压功率放大器是一种电子设备&#xff0c;用于将低电压信号放大到较高电压水平&#xff0c;以满足各种应用需求。它在多个领域中具有广泛的应用&#xff0c;包括科学研究、工业生产、通信技术以及医疗设备。下面安泰电子将介绍高压功率放大器的应用场合。 科学研究 高压功率放…

【最优化方法】实验一 熟悉MATLAB基本功能

实验一  熟悉MATLAB基本功能 实验的目的和要求&#xff1a;在本次实验中&#xff0c;通过亲临使用MATLAB&#xff0c;对该软件做一全面了解并掌握重点内容。 实验内容&#xff1a; &#xff11;、全面了解MATLAB系统 &#xff12;、实验常用工具的具体操作和功能 学习建…

在Open AI的Assistant API中,Thread代表什么?

在OpenAI的Assistant API中&#xff0c;Thread通常代表一系列相关的对话&#xff0c;保持对话的上下文和连贯性。这对于创建连续对话非常重要&#xff0c;因为它允许模型记住先前的交互&#xff0c;并在随后的响应中参考这些信息。 具体作用 保持上下文&#xff1a;Thread可以…

深入学习Python:掌握面向对象编程

在上一篇文章中,我们介绍了Python的基本语法和概念,包括变量、数据类型、条件语句、循环、函数和文件操作。接下来,我们将深入探讨Python的面向对象编程(OOP)特性,这是现代编程中的一个重要概念。通过这篇文章,你将学会如何使用类和对象来组织和管理你的代码。 1. 面向…

哇!数据中台竟是企业数字化转型的关键力量!

在当今数字化浪潮席卷的时代&#xff0c;数据中台正成为企业实现数字化转型的关键力量。那么&#xff0c;究竟什么是数据中台呢&#xff1f;它乃是一种持续让企业数据活跃起来的机制&#xff0c;能够将企业内各部分数据汇聚至一个平台&#xff0c;达成数据的统一化管理。 数据中…

Linux快速定位日志 排查bug技巧和常用命令

1. 快速根据关键字定位错误信息 grep 在 Linux 系统中&#xff0c;可以使用 grep 命令来查找日志文件中包含特定关键字的行。假设你的日志文件路径为 /var/log/myapp.log&#xff0c;你想要查找包含关键字 "abc" 的日志内容&#xff0c;可以按照以下步骤操作&#…