前言
本专栏是笔者在学习《Go程序设计语言》这本书时,对每个章节认为较为重要(容易忘记👻)的知识点记录的笔记,其中也会有少量的思考👀, 现整理成博客分享出来。
如果对专栏感兴趣,跑过去看一眼,书中的每一章都有:《Go程序设计语言》笔记
❗️注意❗️:本专栏不是详细的知识讲解,只是碎片的知识条目,或可作为Go知识点查漏补缺的小工具~
方法声明
- 在函数名之前多一个参数,参数把方法绑定到该参数的类型上:
func (p Point)Distance(p1 Point){}
; - 附加的参数
p
称为接收者; - 非结构体类型也能定义方法,如为
type Path []Point
定义方法:func (p Path) Print(){}
; - 可以为简单类型(数字、字符串、
slice
、map
、甚至函数等)定义附加的行为;但实际上func (p int)TestInt(){}
会包编译错误:invalid receiver int (basic or unnamed type)
; - 但如果
type MyInt int
,可以为MyInt
添加方法; - 同一个包下的任何类型都可以声明方法,只要它的类型不是指针或接口;
指针接收者的方法
- 如声明
func (p *Point)Test(){}
后,方法名称是(*Point).Test
,圆括号是必须的,否则将被解析为*(Point.Test)
; - 不允许为本身是指针的类型进行方法声明;
- 定义
*Point
的方法,也可用变量p
去使用该方法,编译器进行隐式&p
转换,但只有变量才可以转换,临时变量不行; - 接收者是
p
而变量使用的&p
也会隐式地解引用接收者; nil
是一个合法的接收者;
通过结构体内嵌组成类型
- 结构体中的匿名字段,结构体对象可以直接访问匿名对象中的字段,也可以直接访问匿名字段的方法;编译器会自动补充生成结构体的对应方法;
- 但是这不能理解为匿名字段是一个基类,因为结构体对象之间无法调用匿名字段的方法;
方法变量与表达式
- 可以将某个对象的方法设置为变量,则该变量是一个绑定到某个对象的方法;
示例:位向量
- 集合通常使用
map[T]bool
来实现;
封装
Go
语言中封装需要通过结构体来实现,字段和方法都通过首字母大小写来判断可导出性;- 但封装的单元是包,因为无论是否可导出,包内都是可见的;
如有错误 ❌ ,欢迎指正 ☝️~
如有收获 🍗,可以考虑点赞👍/评论💬/收藏⭐️/关注👀,大家共同进步~