持续更新 Go 语言学习进度中 ......

  1. GO语言学习笔记-类型篇 Study for Go! Chapter one - Type - slowlydance2me - 博客园 (cnblogs.com)
  2. GO语言学习笔记-表达式篇 Study for Go ! Chapter two - Expression - slowlydance2me - 博客园 (cnblogs.com)
  3. GO语言学习笔记-函数篇 Study for Go ! Chapter three - Function - slowlydance2me - 博客园 (cnblogs.com)

2023-03-09

Study for Go ! Chapter five - Method

1. Initialization

  • 方法是与对象实例绑定特殊函数

  • 方法是面向对象编程的基本概念,用于维护和展示对象的自身状态。

  • 对象是内敛的,每个实例都有各自不同的独立特征,以属性和方法来暴露对外通信接口

  • 普通函数则专注于算法流程,通过接受参数来完成特定逻辑运算,并返回最终结果。

  • 方法是有关联状态的,而函数则通常没有

  • 方法和函数定义语法区别在于前者有前置实例接受函数 ( receiver ),编译器以此确定方法所属类型。

  • 在某些语言里,尽管没有显式定义,但会在调用时隐式传递 this 实例参数

  • 可以为当前包,以及除接口和指针以外的任何类型定义方法

  • 方法同样不支持重载 (overload),receiver 参数名没有限制,按惯例会选用简短有意义的名称(不推荐使用 this、self)

  • 如方法内部并不引用实例,可省略参数名,仅保留类型

  • 方法可以看作特殊的函数,那么 receiver 的类型自然可以是基础类型或指针类型。这会关系到调用时对象实例是否被复制

  • 可使用实例值或指针调用方法,编译器会根据方法 receiver 类型自动在基础类型和指针类型间转换

  • 不能使用多级指针调用方法

  • 指针类型的 receiver 必须是合法指针 (包括 nil ),或能获取实例地址

How to choice receiver type ?

  • 要修改实例状态,用 *T

  • 无需修改状态的小对象或固定值,建议用 T

  • 大对象建议用 *T,以减少复制成本

  • 引用类型、字符串、函数等指针包装对象,直接用 T

  • 若包含 Mutex 等同步手段,用 *T 避免因复制造成锁操作无效

  • 其他无法确定的情况都用 *T

2. 匿名字段

  • 可以像访问匿名字段成员那样调用其方法,由编译器负责查找

  • 方法也会有同名遮蔽问题,但利用这种特性,可实现类似覆盖(override)操作

  • 尽管能直接访问匿名字段的成员和方法,但它们依然不属于继承关系

3. 方法集

  • 类型有一个与之相关的方法集 ( method set),这决定了它是否实现某个接口

    • 类型 T 方法集包含所有 receiver T 方法

    • 类型 *T 方法集包含所有 receiver T + *T 方法

    • 匿名嵌入 S,T 方法包含所有 receiver S 方法

    • 匿名嵌入 * S,T 方法集包含所有 receiver S + *S方法

    • 匿名嵌入 S 或 *S, *T 方法集包含所有 receiver S + *S 方法

    可利用反射 ( reflect )测试这些规则

  • 方法集仅影响接口实现和方法表达式转换,与通过实例或实例指针调用方法无关。

  • 实例并不使用方法集而是直接调用

  • 匿名字段就是为方法集准备的,否则完全没必要为少写个字段名而大费周章

Attention

  • 面向对象的三大特征 “ 封装 ”、“ 继承 ” 和 “ 多态 ”,golang 仅实现了部分特征,它更倾向于“组合优于继承” 的这种思想。将模块分解成相互独立的更小单元,分别处理不同方面的需求,最后以匿名嵌入的方式组合到一起,共同实现对外接口,而且其简短一致的调用方法,更是隐藏了内部实现细节

  • 组合 没有父子依赖,不会破坏封装,且整体和局部松耦合,可任意增加来实现扩展,各单元持有单一职责,互无关联,实现和维护更加简单

  • 尽管接口也是多态的一种实现方式,但其应该和基于继承体系的多态分离开来

4. expression

  • 方法和函数一样,除直接调用外,还可以赋值给变量,或作为参数传递,依照具体引用方式的不同,可分为 expression 和 value 两种状态

Method Expression

  • 通过类型引用的 method expression 会被还原为普通函数样式,receiver 是第一参数,调用时须显式传参,至于类型,可以是 T 或 *T,只要目标方法存在于该类型方法集中即可

  • 当然也可以以表达式方法调用

Method Expression

  • 基于实例或指针引用的 method value,参数签名不会改变,依旧按正常方式调用

  • 但当 method value 被赋值给变量或作为参数传递时,会立即计算并赋值该方法执行所须的 receiver 对象,与其绑定,以便在稍后执行时,能隐式传入 receiver 参数

  • 编译器会为 method value 生成一个包装函数,实现间接调用,至于 receiver 复制,和闭包的实现方法基本相同,打包成 funcval,经由 DX 寄存器传递

  • 当 method value 作为参数时,会复制含 receiver 在内的整个 method value

  • 当然如果目标方法的 receiver 时指针类型,那么被复制的仅是指针

  • 只要 receiver 的参数类型正确,使用 nil 同样可以执行

GO语言学习笔记-方法篇 Study for Go ! Chapter five - Method的更多相关文章

  1. Scala语言学习笔记——方法、函数及异常

    1.Scala 方法及函数区别 ① Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法 ② Scal ...

  2. C语言学习笔记——特别篇(VScode安装使用)

    B站有同步教学视频 参考博文: https://www.cnblogs.com/czlhxm/p/11794743.html 注意事项: 请在英文目录下运行!!! VScode下载链接: https: ...

  3. 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项

    博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...

  4. PHP学习笔记 - 进阶篇(7)

    PHP学习笔记 - 进阶篇(7) 文件操作 读取文件内容 PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中. $conte ...

  5. PHP学习笔记 - 进阶篇(2)

    PHP学习笔记 - 进阶篇(2) 函数 1.自定义函数 PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言.大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一 ...

  6. PHP学习笔记 - 进阶篇(11)

    PHP学习笔记 - 进阶篇(11) 数据库操作 PHP支持哪些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Syba ...

  7. PHP学习笔记 - 进阶篇(10)

    PHP学习笔记 - 进阶篇(10) 异常处理 抛出一个异常 从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被 ...

  8. PHP学习笔记 - 进阶篇(9)

    PHP学习笔记 - 进阶篇(9) 图形图像操作 GD库简介 GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新 ...

  9. PHP学习笔记 - 进阶篇(6)

    PHP学习笔记- 进阶篇(6) 会话控制(session与cookie) 当前的Cookie为: cookie简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据. ...

  10. PHP学习笔记 - 进阶篇(4)

    PHP学习笔记 - 进阶篇(4) 字符串操作 字符串介绍 PHP开发中,我们遇到最多的可能就是字符串. 字符串变量用于包含字符串的值. 一个字符串 通过下面的3种方法来定义: 1.单引号 2.双引号 ...

随机推荐

  1. Oracle数据泵恢复用户数据实例

    我们测试环境经常会遇到恢复生产数据的情况,我一般比较习惯使用数据泵来搞,这个具体根据自己的业务形态选择适合自己的方式. 此次我们说的是完全恢复用户数据,具体步骤如下: 1.备份数据 expdp tes ...

  2. C#使用SharpZipLib解压多文件的zip压缩文件数据流,保存到本地

    代码: public async Task<ReturnModel<List<string>>> UploadModel() { var task = new Ta ...

  3. 解决“chrome正受到自动测试软件的控制”信息栏显示问题

    在使用Selenium WebDriver启动谷歌浏览器Chrome时,在新启动的浏览器地址栏下方经常会显示一行提示信息:"chrome正受到自动测试软件的控制",英文的就是&qu ...

  4. python获取报文参考代码

    # -*- coding:utf-8 -*- import sys import stomp import logging import time class MyListener(object): ...

  5. pytorch学习笔记(8)--现有模型的使用和修改

    官网网址: https://pytorch.org/vision/0.9/models.html#semantic-segmentation (1).ImageNet train_data = tor ...

  6. 搭建Spring的源码环境

    搭建Spring的源码环境,包括以下几个步骤: 1.从Spring官网一步步找到Spring源码在github上的位置,并拉取Spring源码 2.安装和配置Gradle,用于构建Spring的源码 ...

  7. java中BIO、NIO、AIO区别

    ava中的IO主要源自于网络和本地文件 IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启 ...

  8. python机器学习——PCA降维算法

    背景与原理: PCA(主成分分析)是将一个数据的特征数量减少的同时尽可能保留最多信息的方法.所谓降维,就是在说对于一个$n$维数据集,其可以看做一个$n$维空间中的点集(或者向量集),而我们要把这个向 ...

  9. 移动APP测试要点

    一. UI测试 (1) 页面布局 ① 页面布局合理且友好,符合用户习惯 ② 列表型界面有滚动条 ③ 功能入口明显,容易找到 (2) 图形测试 ① 图片大小合适且清晰 ② 页面字体与风格一致 ③ 背景颜 ...

  10. 10 soundJs 初体验

    最近想做一个h5的小游戏所以用上了soundjs. 还在开发中  http://www.hetenglife.com/mouse/game.html 刚刚把控制做完. 首先是要导入这个文件 <s ...