golang基础(29.为基本类型添加成员方法)
在 Go 语言中,你可以给任意类型(包括基本类型,但不包括指针类型)添加成员方法,但是如果是基本类型的话,需要借助 type 关键字对类型进行再定义,例如:
package main
type Integer int
func (a Integer) Equal(b Integer) bool {
return a == b
}
:::success 注意,这个时候 Integer 已经是一个新的类型了,这与 type Integer = int 不同,后者只是为 int 类型设置一个别名。 ::: 在这个例子中,我们定义了一个新类型 Integer,它和 int 没有本质不同,只是它为内置的 int 类型增加了个新方法 Equal()。 这样一来,就可以让基本类型的整型像一个普通的类一样使用:
package main
import "fmt"
type Integer int
func (a Integer) Equal(b Integer) bool {
return a == b
}
func main() {
var a Integer = 2
if a.Equal(2) {
fmt.Println("a is equal to 2")
} else {
fmt.Println("a not equal to 2")
}
}
这有点类似 Java 中的装箱功能(boxing),即将基本类型转化为对应的对象类型,这个工作可以自动完成,也可以调用 valueOf 方法手动完成,只不过在 Go 语言中,我们可以通过上面这种自定义方式轻松实现基本类型与面向对象类型的转换,我们还可以为自定义的 Integer 类添加其它成员方法:
package main
import "fmt"
type Integer int
func (a Integer) Equal(b Integer) bool {
return a == b
}
func (a Integer) Less(b Integer) bool {
return a < b
}
func (a Integer) More(b Integer) bool {
return a > b
}
func (a *Integer) Increase(i Integer) {
*a += i
}
func (a *Integer) Decrease(i Integer) {
*a -= i
}
func main() {
var a Integer = 2
if a.Equal(2) {
fmt.Println("a is equal to 2")
} else {
fmt.Println("a not equal to 2")
}
a.Increase(2)
fmt.Println(a)
a.Decrease(2)
fmt.Println(a)
}
在 Go 语言中,面向对象的神秘面纱被剥得一干二净,没有隐藏的 this 指针(也没有 PHP 中的 self、parent 之类的关键字),没有隐式执行的构造函数和析构函数,方法和属性的可见性不是通过 private、protected、public 之类的关键字来实现,这些传统面向对象编程包含的隐晦术语在 Go 语言中都被显式代码所替代,一切都是所见即所得,所写即所得。严格来说,该方法并不属于 Integer 类,而是属于指向 Integer 的指针类型,所以,归属于 Integer 的成员方法只是 Integer 类型下所有可用成员方法的子集,归属于 *Integer 的成员方法才是 Integer 类完整可用方法的集合,我们在调用方法时,之所以可以直接在 a 实例上调用 increase 方法,是因为 Go 语言底层会自动将 a 转化为对应的指针类型 &a,所以真正调用的代码是 (&a).increase(b),这一点需要大家知晓。总结下来就是一个自定义数据类型的方法集合中仅会包含它的所有「值方法」,而该类型对应的指针类型包含的方法集合才囊括了该类型的所有方法,包括所有「值方法」和「指针方法」