Go:对象 接口 继承

对象
go语言中面向对象的风格和c语言中类似,由类和方法(相当于类的函数)构成。
定义一个点类

type Point struct{
 	x,y float64
}

在c++中,类中的成员和函数分为私有private和公有public。在go中也类似的这样区分,不同的是
public 成员和方法的首字母大写
private 成员和方法的首字母小写

建立一个对象

	/*通过new建立新的对象*/
	var p *Point = new(Point)//p 是对象的指针
	p.x = 3
	p.y = 4
	/*建立对象并初始化*/
	var p1 Point = Point{3,4}
	var p2 *Point = &Point{3,4}

其中,通过内置函数new来建立对象,返回一个指针,指向一块内存单元,所以建立对象是类型就变成了*Point

给对象添加方法,形如 func (对象 类名) 方法名()返回值类型 {操作}
应用

type Point struct {
	x, y float64
}
func (p Point) Distance() float64 { //给点类增加一个方法,返回距离
	return math.Sqrt(p.x*p.x + p.y*p.y)
}
func main() {
	//var p *Point = new(Point) //new返回的是个地址 所以是*point
	// p.x = 3
	// p.y = 4

	p1 := Point{3, 4}
	fmt.Println(p1.Distance())
}

type Point struct {
	x, y float64
}
func (self Point) Scale(factor float64) {//放大坐标
	self.x = self.x * factor
	self.y = self.y * factor
}
func main() {
	//var p *Point = new(Point) //new返回的是个地址 所以是*point
	// p.x = 3
	// p.y = 4
	
	p1 := Point{3, 4}
	p1.Scale(2)
	fmt.Println(p1)
}
{3 4}

想要通过方法进行参数扩大,但结果并没有改变,因为只向方法中传递了一个值,并不能影响其本身的大小。

若想进行参数放大,需要向方法中传递一个地址

type Point struct {
	x, y float64
}
func (self *Point) Scale(factor float64) {//放大坐标
	self.x = self.x * factor
	self.y = self.y * factor
}
func main() {
	p1 := Point{3, 4}
	p1.Scale(2)
	fmt.Println(p1)
}
{6 8}

接口
若几个对象间存在公共行为,则可将行为抽象出来定义为接口。接口实际上就是方法的集合

type Printer interface {
	Print() //公共行为,相当于一个公共的方法
	//add other methods
}
type user struct {
	name string
	age  byte //char
}
type goods struct {
	name       string
	num, price byte
}
func (u user) Print() {
	fmt.Println(u)
}
func (g goods) Print() {
	fmt.Println(g)
}
func main() {
	u := user{"Tom", 18}
	g := goods{"bed", 10, 200}
	u.Print()  
	g.Print()

或者

var ip Printer//定义了接口变量p
	ip = u //接口的公端和母端结合,ip相当于一个主板,u相当于插入主板的用户,一个电脑主机和U盘的结合
		//将对象u赋给接口变量p
	ip.Print()//调用接口中的公共方法
	ip = g//将接口变量p的值改为g
	ip.Print()
}

继承
go语言通过匿名组合来实现类似继承的功能

type user struct {
	name string
	age  byte
}
type leader struct {
	user//匿名成员,可以实现继承
	title string
}
func (u user) Output() {
	fmt.Println(u)
}
func main() {
	var l leader
	l.name = "tom"
	l.age = 35
	l.title = "boss"
	l.Output()//继承了User类的成员和方法

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值