Go 语言方法

Go method
创建于:2020年08月14日 更新于:2020年08月23日

method语法

func (r ReceiverType) funcName (parameters) (results)

知道半径,求圆形面积

package main

import (
    "fmt"
    "math"
)

type Circle struct{
    radius float64
}

func (c Circle) area() float64{
    return math.Pi*c.radius*c.radius
}

func main() {
    c := Circle{10}

    fmt.Printf("Area of c is:%.2f", c.area())
}

此处方法的Receiver是以值传递,而非引用传递,Receiver还可以是指针,两者的差别在于,指针作为Receiver会对实例对象的内容发生操作,而普通类型作为Receiver仅仅是以副本作为操作对象,并不对原实例对象发生操作

method 不仅可以用于 struct 上面,它可以定义在任何你自定义的类型、内置类型、struct等各种类型上面。

method 继承

如果匿名字段实现了一个method,那么包含这个匿名字段的struct也能调用该method。

package main

import (
    "fmt"
)

type Person struct{
    name, phone string
    age int
}

type Tom struct{
    Person
}

type Tony struct{
    Person
}

func (p *Person) say(){
    fmt.Printf("I'm %s, you can call me on %s\n", p.name, p.phone)
}

func main() {
    tom := Tom{Person{"Tom", "111-1111", 18}}
    tom.say() // I'm Tom, you can call me on 111-1111

    tony := Tony{Person{"Tony", "222-2222", 20}}
    tony.say() // I'm Tony, you can call me on 222-2222
}

method 重写

如果Tom想要实现自己的 say() 方法,和匿名字段冲突一样的道理,在Tom上定义一个method,重写say方法

package main

import (
    "fmt"
)

type Person struct{
    name, phone string
    age int
}

type Tom struct{
    Person
    phone string
}

func (p *Person) say(){
    fmt.Printf("I'm %s, you can call me on %s\n", p.name, p.phone)
}

func (t *Tom) say(){
    fmt.Printf("I'm new %s, you can call me on %s\n", t.name, t.phone)
}

func main() {
    tom := Tom{Person{"Tom", "111-1111", 18}, "222-2222"}
    tom.say() // I'm new Tom, you can call me on 222-2222
}