Go 方法

Go 方法

go 复制代码
func (s *service) CreateRule(str string ) (*response.OptResponse, *exception.CustomException)
关键字  receiver   方法名     入参           返回值
{ 
  方法体
}

方法相比函数,多了一个receiver参数。

go中的方法必须属于一个类型,receiver的类型就是方法归属的类型。

每个方法只能有一个receiver参数。

receiver 参数的基类型本身不能是指针类型 或者接口类型

方法声明要于receiver参数的基类型声明放在同一个包内。

* 不能为原生类型(int,float64,map等)添加方法

* 不能跨越go包为其他包的类型声明新方法

Go 语言中的方法的本质就是,一个以方法的 receiver 参数作为第一个参数的普通函数

go 复制代码
func (t T) M1() <=> F1(t T)
func (t *T) M2() <=> F2(t *T)

当 receiver 参数的类型为 T 时, F1 对T做的修改,只会影响副本,不会影响原T,实际上传递的是 T 类型实例的副本

当 receiver 参数的类型为 *T 时,F2 对T做的修改,会反映到原T,实际上传递的是 T 类型实例的地址

选择方法接收者使用 T 还是 *T 主要基于以下几个关键因素

  1. 是否需要修改接收者本身,需要的话,用*T
    无论是 T 类型实例,还是 *T 类型实例,都既可以调用 receiver 为 T 类型的方法,也可以调用 receiver 为 *T 类型的方法
  2. receiver 参数类型的 size 的大小
    如果size较大的情况,以值拷贝形式传入会导致较大的性能开销,选择*T
    size较小的情况,使用T,更高效,避免指针解引用。
  3. 一致性原则
    如果结构体有指针接收者方法,建议统一使用指针接收者。

方法集合

Go 语言规定,*T 类型的方法集合包含所有以 *T 为 receiver 参数类型的方法,以及所有以 T 为 receiver 参数类型的方法

Go 就会优先使用结构体自己实现的方法

无论原类型是接口类型还是非接口类型,类型别名都与原类型拥有完全相同的方法集合

类型嵌入对新类型的方法集合的影响

  • 结构体类型的方法集合包含嵌入的接口类型的方法集合
  • 当结构体类型 T 包含嵌入字段 E 时,*T 的方法集合不仅包含类型 E 的方法集合,还要包含类型 *E 的方法集合
相关推荐
浩瀚之水_csdn2 小时前
【框架】flask路由深度解析
后端·python·flask
灰色小旋风2 小时前
力扣 12 整数转罗马数字 C++
开发语言·c++·leetcode
希望永不加班2 小时前
Spring Boot 统一异常处理:从混乱到优雅的实用方案
java·spring boot·后端·spring·状态模式
学习要积极2 小时前
Spring 组件工具类-FFmpegUtils
java·后端·spring
LONGZETECH2 小时前
智能网联汽车故障诊断仿真教学软件技术解析——C/S架构落地与全模块实现
c语言·开发语言·架构·汽车·汽车仿真教学软件·汽车教学软件·智能网联汽车软件
JIes__2 小时前
lua语法——基础知识总结
开发语言·lua
_OP_CHEN2 小时前
【MySQL数据库基础】(五)MySQL 数据类型深度解析:选对类型 = 性能拉满!
linux·开发语言·数据库·sql·mysql·数据类型·c/c++
LONGZETECH2 小时前
汽车车身测量与结构件更换仿真教学系统架构全解析
c语言·开发语言·架构·系统架构·汽车·汽车教学软件·智能网联汽车软件
l14372332672 小时前
短剧多语种翻译的技术难点:为什么AI翻译比人工翻译更适合出海?
开发语言·人工智能·php