10.6 方法

Kesa...大约 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 指针或值作为接收者

  • : 作为接收者传递给方法,会进行值的拷贝。 方法中无法对接受者进行修改。
  • 指针:作为接收者,方法可以对接受者进行修改

指针方法和值方法都可以在指针或非指针上调用

10_6_methods.go

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 方法和未导出字段

​ 结构体中的未导出字段是无法直接访问的,可以通过settergetter方法来访问。

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 内嵌类型的方法和继承

当一个匿名类型被内嵌在结构体中时,匿名类型的可见方法也同样被内嵌,这在效果上等同于外层类型 继承 了这些方法:将父类型放在子类型中来实现亚型

10_6_method_h.go

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