Go 语言方法
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
}