Type metods

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)
}

你可能感兴趣的:(Type metods)