10.6 方法
...大约 2 分钟
10.6 方法
10.6.1 定义
方法:作用在**接受者(receiver)**上的函数,接收者是某种类型的变量。
接收者类型:可以是任何类型,除了
- 接口类型
 - 指针类型(可以是其他类型的指针)
 
方法集(method set):类型 T/ *T 上所有方法的合集
定义:
func (recv receiver_type) methodname(parameter_list) (return_value_list) {
    ...
}
recv: recevier 的实例- 若为指针,则会自动解引用
 - 若方法中不需要使用,可用空白符
_替换 
类型和其方法必须在同一个包中。
10.6.2 函数和方法的区别
函数将变量作为参数:Function(recv) 方法在变量上调用:recv.Method
方法和接收者类型必须在同一个包中定义。
10.6.3 指针或值作为接收者
- 值: 作为接收者传递给方法,会进行值的拷贝。 方法中无法对接受者进行修改。
 - 指针:作为接收者,方法可以对接受者进行修改
 
指针方法和值方法都可以在指针或非指针上调用。
type A struct {
	n int
}
func (a *A) set(n int) {
	a.n = n
}
func (a A) String() string {
	return fmt.Sprint(a.n)
}
func methods() {
	// 值
	a1 := A{1}
	fmt.Println(a1)
	a1.set(2)
	fmt.Println(a1)
	// 指针
	a2 := &A{10}
	fmt.Println(a2)
	a2.set(20)
	fmt.Println(a2)
}
1
2
10
20
10.6.4 方法和未导出字段
 结构体中的未导出字段是无法直接访问的,可以通过setter和getter方法来访问。
type A struct {
    a int
}
func (a *A) SetA(n int) {
    a.a = n
}
func (a *A) GetA() int {
    return a.a
}
10.6.5 内嵌类型的方法和继承
当一个匿名类型被内嵌在结构体中时,匿名类型的可见方法也同样被内嵌,这在效果上等同于外层类型 继承 了这些方法:将父类型放在子类型中来实现亚型。
type Point struct {
	x, y float64
}
func (p *Point) Abs() float64 {
	return math.Sqrt(p.x*p.x + p.y*p.y)
}
type NamedPoint struct {
	Point
	name string
}
type NamedPoint2 struct {
	Point
	name string
}
func (np *NamedPoint2) Abs() float64 {
	return np.Point.Abs() * 100
}
func mh() {
	n := &NamedPoint{Point{3, 4}, "Node"}
	fmt.Println(n.Abs()) // 5
	n2 := &NamedPoint2{Point{3, 4}, "Node2"}
	fmt.Println(n2.Abs()) // 500
	fmt.Println(n2.Point.Abs())
}
外层方法和内层同名,将会复写内层方法。
10.6.6 如何在类型中嵌入功能
- 聚合(组合): 包含一个所需功能类型的具名字段
 - 内嵌: 内嵌匿名所需功能类型
 
10.6.7 多重继承
通过在类型中嵌入所有必要的父类型,可以很简单的实现多重继承。
 Powered by  Waline  v2.15.2
