方法 Method
Go 中虽然没有class
,但依旧有method
,通过显示说明receiver
来实现与某个类型的组合,只能为同一个包中的类型定义方法,receiver
可以是类型的值或指针。
method
不存在方法重载,可以是使用值或指针来调节方法,编译器会自动完成转换,从某种意义上来说,方法是函数的语法糖,因为receiver
其实就是方法所接收的第一个参数(Method Value vs Method Expression)
如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法,类型别名不会拥有底层类型所附带的方法。
方法可以待用结构中的非公开字段
例子
1 | type SysUser struct { |
输出
1 | 123 |
其中ToString
接收体是SysUser
不存在重载,通过类型绑定区分
1 | type SysUser struct { |
输出
1 | 123 |
在这里,ToString
分别绑定了SysUser
和SysOrg
,区分开了2种。
以下这种是不行的,以下函数针对同一个类型,区分不出来用户使用那一个。
1 | func (user SysUser) ToString() { |
编译错误:
1 | # command-line-arguments |
可以是值或指针
如果是值类型,只是拷贝值,进行值传递。如果是指针类型,最终会影响到地址对应的值
1 | func (user *SysUser) ToString() { |
输出
1 | 123 |
可以看到值发生了改变
底层类型
1 | type TZ int |
输出
1 | TZ |
底层类型就可以自由加入方法的绑定
对比
Method Value
通过值进行调用
1 | var a TZ |
Method Expression
通过一种类型进行调用
1 | (*TZ).Print(&a) |
方法访问权限与字段
1 | type A struct{ |
在同一个包内就可以进行访问,修改。当超出包的范围后,只有首字母大写字段暴露出去。
练习
声明一个底层类型为int的类型,并实现调用方法递增到100
1 | func (a *TZ) Increase(num int) { |
输出
1 | 100 |