go面向对象方法的调用

go面向对象方法的调用

在面向对象三大特征(封装、继承和多态)里面,go语言只有封装这个功能。但可以使用匿名字段包含,间接实现继承。

type Resouce struct {
	_ uint8
	id int
}

type User struct {
	Resouce //匿名字段,User间接继承自Resource
	name string
}

// 接收者类型为 User 时,可访问方法集全部为 User 的方法,简称 T 方法
// 接收者类型类型 *User 时,可访问方法集为 User 和 *User 的方法,简称 T + *T 方法。
// 接收者类型类型 Manager 包含匿名字段 User,则 Manager 方法集包含 User 方法。
// 接收者类型类型 Manager 包含匿名字段 *User,则 Manager 方法集包含 T + *T 方法。
// 不管嵌入 User 或 *User,*Manager 方法集总是包含 T + *T 方法。

func (self *User) ToString() string {
	return fmt.Sprintf("User = %p, %v", self, self)
}

func (self User) TestValue() {//User拷贝
	fmt.Printf("TestValue: %p, %v\n", &self, self)
}

type Manager struct {
	User//匿名字段
	title string
}

func (self *Manager) ToString() string {
	return fmt.Sprintf("Manager = %p, %v", self, self)
}

func main() {
	m := Manager{User{Resouce{id:1}, "jorn"}, "zhang"}
	fmt.Println(m.ToString())
	fmt.Println(m.User.ToString()) //通过匿名字段,获得和继承类似的利用能力

	//调用方法一:instance.method(args...)
	mInstance := m.ToString()
	m.name = "huangbin"
	fmt.Println(mInstance)
	fmt.Println(m.ToString())

	//调用方法二:<type>.func(instance, args...)
	mFunc := (*User).ToString
	fmt.Println(mFunc(&m.User))

	mFunc2 := (User).TestValue
	mFunc2(m.User)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值