欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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。