Go程序设计语言读书笔记-第六章

第六章-方法

方法声明:只是在普通函数名字前面多了一个参数。这个参数吧这个方法绑定到这个参数对应的类型上。附加的参数p成为方法的接收者。

func (p Point)Distance(q Point)float64{
	return math.Hypot(q.X-p.X,q.Y-p.Y)
}

Go和许多其他面向对象的语言不同,他可以将方法绑定到任何类型上。可以很方便地为简单的类型定义附加的行为。同一个包下的任何类型都可以声明方法,只要它的类型既不是指针类型也不是接口类型。

指针接收者的方法:由于主调函数会复制每一个实参变量,可以使用指针类型。如下:

func(p *Point)ScaleBy(factor float64){
	p.X *= factor
	p.Y *= factor
}

r := &Point{1,2}
r.ScaleBy(2)

p := Point{1,2}
pptr := &p
pptr.ScaleBy(2)

p:= Point{1,2}
(&p).ScaleBy(2)

匿名字段类型可以是个指向命名类型的指针,这个时候,字段和方法间接地来自于指向的对象。

type ColorRedPoint strcut{
	*Point
	Color color.RGBA
}

方法变量与表达式
方法变量:

func (p Point)Distance(q Point)float64{
	return math.Hypot(q.X-p.X,q.Y-p.Y)
}

p := Point{1,2}
q := Point{1,2}

disntanceFromP := p.Distance   //方法变量
fmt.Println(disntanceFromP(q))

方法表达式:

func (p Point)Distance(q Point)float64{
	return math.Hypot(q.X-p.X,q.Y-p.Y)
}

p := Point{1,2}
q := Point{1,2}

distance := Point.Distance   //方法表达式
fmt.Println(distance(p,q))   //

封装:如果变量是不能通过对象访问到的,这称作封装的变量或者方法。

Go语言只有一种方式控制命名的可见性:定义的时候,首字母大写的标识符是可以从包中导出的,而首字母没有大写的则不导出。同样的机制也同样作用于结构体内的字段和类型中的方法。

结论就是,要封装一个对象,必须使用结构体。

另一个结论就是在Go语言中封装的单元是包而不是类型。无论在函数内的代码还是方法内的代码,结构体类型内的字段对于同一个包中的所有代码都是可见的。

仅仅用来获得或者修改内部变量的函数成为getter和setter。

猜你喜欢

转载自blog.csdn.net/Rage_/article/details/89327335