type method 是go语言中一个强大的工具,它可以让你轻松的实现对任意类型对象功能的扩展,对接口的实现也是通过它来实现的
对普通类型的扩展
type method 与普通函数相比,唯一的不同是在函数名称前面加了一个接受参数(receiver argument), 即这个参数是这个函数的接受者,即这个参数拥有了这个函数
type twoInts struct{
X int64
Y int64
}
func normalFunc(a, b int64) twoInts{
temp := twoInts{a, b}
return temp
}
func (a twoInts) method(b twoInts) twoInts{
temp := twoInts{X: a.X + b.X, Y: a.Y + b.Y}
return temp
}
func main(){
a := normalFunc(1, 2)
b := normalFunc(3, 4)
c := a.method(b)
fmt.Println(c)
}
如上例所示,a.method(b), a拥有了method方法;任意一个twoInts 变量都可以调用这个method方法,即twoInts类型的变量拥有了这个方法。
通过它,我们可以给任意类型的变量加方法
对接口的实现
type Shape interface{
Area() float64
Perimeter() float64
}
上面一段代码定义了一个接口,想要实现以上接口并不需要像java那样去显示的implements它,只有你通过type method的方式实现了Area 和Perimeter,那么你就实现了该接口。你就可以将你的类型传递给,任何需要interface类型的对象的地方
package main
import (
"fmt"
"math"
"myInterface"
)
type square struct{
X float64
}
type cricle struct{
R float64
}
func (s square) Area() float64{
return s.X * s.X
}
func (s square) Perimeter() float64{
return s.X * 4
}
func (c cricle) Area() float64{
return c.R * c.R * math.Pi
}
func (c cricle) Perimeter() float64{
return 2 * c.R * math.Pi
}
func Calculate(x myInterface.Shape){
_, ok := x.(cricle)
if ok{
fmt.Println("it is a cricle")
}
v, ok := x.(square)
if ok{
fmt.Println("it is s aquare", v)
}
fmt.Println("area: ", x.Area())
fmt.Println("perimeter: ", x.Perimeter())
}
func main(){
s := square{3}
c := cricle{4}
Calculate(s)
Calculate(c)
}
网友评论