m := make([]int, 10, 20) // Same as new([20]int)[:10]
方法看起来像一个普通的函数定义,但它有一个receiver(接收者)。receiver是类似Java实例方法中的this引用。
type MyType struct { i int }
func (p *MyType) Get() int {
return p.i
}
var pm = new(MyType)
var n = pm.Get()
这声明了一个方法Get
与MyType
关联的。receiver被命名为p
在函数体内。
命名的类型来定义方法。如果您转换不同类型的值,新的值将有新的类型,而不是那些旧的类型。
你可以定义一个内置类型的方法,用新的命名类型声明。新的类型和内置的类型是不同的。
type MyInt int
func (p MyInt) Get() int {
return int(p) // The conversion is required.
}
func f(i int) {}
var v MyInt
v = v * v // The operators of the underlying type still apply.
f(int(v)) // int(v) has no defined methods.
f(v) // INVALID
Go接口类似于Java接口,但可被视为一个实现该接口提供任何类型的在Go接口命名的方法。明确的声明是不必要的。
接口像这样:
type MyInterface interface {
Get() int
Set(i int)
}
自从 MyType
已经有了Get
方法, 我们可以让 MyType
满足接口通过添加
func (p *MyType) Set(i int) {
p.i = i
}
现在任何只要将MyInterface
当做参数就可以接收类型是*MyType
的变量
func GetAndSet(x MyInterface) {}
func f1() {
var p MyType
GetAndSet(&p)
}
在Java术语,给*MyType
定义 Set
和Get
使*MyType
自动实现了MyInterface
接口。这种类型型可满足多个接口。这是一种形式的鸭子类型。
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
James Whitcomb Riley
匿名域可以用于实现很像一个Java子类的东西。
type MySubType struct {
MyType
j int
}
func (p *MySubType) Get() int {
p.j++
return p.MyType.Get()
}
MySubType
有效实现的像是MyType
的子类型.
func f2() {
var p MySubType
GetAndSet(&p)
}
Set
方法是继承自MyType
的,因为关联了匿名域的方法的变为了封闭类型的方法。在这种情况下,因为 MySubType
有一个匿名与域 MyType
类型,所以为 MyType
e的方法也成为MySubType
的方法。Get
方法被重写,Set
方法被继承。
这是与Java中的子类不完全相同。当一个匿名域的方法被调用时,它的 receiver就是这个匿名域,而不是周围的结构体。换句话说,匿名域上的方法的不会动态调度。当你想要实现相当于Java的动态方法查找,请使用接口。
func f3() {
var v MyInterface
v = new(MyType)
v.Get() // Call the Get method for *MyType.
v = new(MySubType)
v.Get() // Call the Get method for *MySubType.
}
使用一个类型断言可以使具有一个接口类型的变量转换成具有不同的接口类型。这是在运行时动态执行。与Java不同,并不需要任何声明两个接口之间的关系。
type Printer interface {
Print()
}
func f4(x MyInterface) {
x.(Printer).Print() // type assertion to Printer
}
转换为Printer
完全是动态的。只要x
(x中存储的值的实际类型)的 动态类型 定义了一个Print
方法。
=========未完待续…
=======转载注明出处=
资料过多,篇幅有限
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。
======转载注明出处=
[外链图片转存中…(img-H3ZgQoSQ-1718772344169)]
[外链图片转存中…(img-8C6Ff439-1718772344170)]
资料过多,篇幅有限
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。