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