如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多往期文章在我的个人博客
前言
Golang语言内虽然没有明确的面向对象概念,但中华儿女多奇志,基于已有的struct结构体,我们也能实现面向对象的代码。
重温结构体
type BaseNum struct {
	Num1 int
	Num2 int
}
这里有一个 BaseNum 的结构体,代表要进行数学运算的两个数的集合,分别有 Num1、 Num2 成员变量标记。
给结构体添加方法
func (baseNum *BaseNum) setNum1(num int)  {
	baseNum.Num1 = num
}
func (baseNum *BaseNum) setNum2(num int)  {
	baseNum.Num2 = num
}
func (num *BaseNum) add() {
	fmt.Printf("result: %d\n", num.Num1 + num.Num2)
}
方法是对特定类型进行操作的函数。func 跟着的 (baseNum *BaseNum) 就是指定方法从属的对象。
而*BaseNum带有的*指其应用原实例的 BaseNum 结构体地址进行成员变量操作
继承
在结构体内嵌入另一个结构体,被嵌入的结构体 就继承了 嵌入的结构体 提供属性和方法。比如:
我们现在定义两数集合结构体BaseNum,是专门给加法用的。我们可以这么写
type AddNum struct {
	BaseNum
}
func ( addNum *AddNum ) Operation() int {
	addNum.add()
	return addNum.Num1 + addNum.Num2
}
重写
子类(结构体)中的方法,与父类中的方法名称重复,等于将父类中相同名称方法的功能给重写,比如还是刚才的例子:
type AddNum struct {
	BaseNum
}
func ( addNum *AddNum ) Operation() int {
	addNum.add()
	return addNum.Num1 + addNum.Num2
}
func ( addNum *AddNum ) add() int {
	return addNum.Num1 + addNum.Num2
}
func main() {
	addNum := AddNum{BaseNum{Num1:3,Num2:4}}
	ret1 := addNum.add()
	fmt.Println(ret1) // 7
}
完整代码
package main
import "fmt"
type BaseNum struct {
	Num1 int
	Num2 int
}
func (baseNum *BaseNum) setNum1(num int)  {
	baseNum.Num1 = num
}
func (baseNum *BaseNum) setNum2(num int)  {
	baseNum.Num2 = num
}
func (num *BaseNum) add() {
	fmt.Printf("result: %d\n", num.Num1 + num.Num2)
}
type AddNum struct {
	BaseNum
}
func ( addNum *AddNum ) Operation() int {
	addNum.add()
	return addNum.Num1 + addNum.Num2
}
func ( addNum *AddNum ) add() int {
	return addNum.Num1 + addNum.Num2
}
func main() {
	// v1
	num := BaseNum{}
	num.setNum1(1)
	num.setNum2(2)
	num.add()
	// v2
	addNum := AddNum{BaseNum{Num1:3,Num2:4}}
	addNum.Operation()
	ret1 := addNum.add()
	fmt.Println(ret1)
}
