对象
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类的成员和方法
}