Go程序设计语言读书笔记-第六章
程序员文章站
2024-02-09 18:14:04
...
第六章-方法
方法声明:只是在普通函数名字前面多了一个参数。这个参数吧这个方法绑定到这个参数对应的类型上。附加的参数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。
上一篇: 软件构造Lab4实验总结—日志
下一篇: Android群英传读书笔记(第六章)