一、method,就是Golang 中一个带有接收者的函数 ,如下:
type Human struct {
Name string
Age int
}
func (f Human) getName() string{ // (f Human) 就是接收者
return f.Name
}
func main(){ f := Human{'yeelone',24}
fmt.Printf("HI,my friend's name is :%s\n",f.getName()) }
简单的使用方法就是这样。
一开始可能会迷惑,它的作用是什么 ? 俗话说存在即合理。再看下面的例子:
package main
import (
"fmt"
"math"
)
type Rectangle struct {
width ,height float64
}
type Circle struct {
radius float64
}
//计算长方形的面积
func Area_rectangle(r Rectangle) float64 {
return r.width * r.height
}
//计算圆形的面积
func Area_circle(c Circle) float64{
return c.radius * c.radius * math.Pi
}
func main(){
r := Rectangle{24, 3}
c := Circle{10}
fmt.Println("Area of r:",Area_rectangle(r))
fmt.Println("Area of c:",Area_circle(c))
}
有没有觉得代码很不优雅~~同样是计算面积,我们使用了 Area_rectangle() 和 Area_circle() 这两个函数名,如果还有更多的形状的图形面积需要计算呢,每一个都这样命名一个函数名吗? 这让人不舒服 。
所以method就可以解决这个问题:
package main
import (
"fmt"
"math"
)
type Rectangle struct {
width ,height float64
}
type Circle struct {
radius float64
}
//计算长方形的面积
func (r Rectangle)area() float64 {
return r.width * r.height
}
//计算圆形的面积
func (c Circle)area() float64{
return c.radius * c.radius * math.Pi
}
func main(){
r := Rectangle{24, 3}
c := Circle{10}
fmt.Println("Area of r:",r.area())
fmt.Println("Area of c:",c.area())
}
现在我们只需要一个函数名:area() 。会不会感觉舒服一点了。我个人是很喜欢这个特性的。
二、method的继承
method是可以继承和重载的,看如下代码:
package main
import (
"fmt"
)
type Rectangle struct {
width ,height float64
}
type Box struct {
Rectangle
size int
}
func (r Rectangle)area() float64 {
return r.width * r.height
}
func main(){
r := Rectangle{24, 3}
b := Box{Rectangle{48,9},30}
fmt.Println("Area of r:",r.area())
fmt.Println("Box of r:",b.area()) //Box继承了area方法
}
重载又是怎么样的呢:
package main
import (
"fmt"
)
type Rectangle struct {
width ,height float64
}
type Box struct {
Rectangle
size int
}
func (r Rectangle)area() float64 {
return r.width * r.height
}
func (b Box)area() int {
return b.size
}
func main(){
r := Rectangle{24, 3}
b := Box{Rectangle{48,9},30}
fmt.Println("Area of r:",r.area())
fmt.Println("Box of r:",b.area())
}
很简单吧,只需要 再写一个area()函数指定Box为接收器就可以了。
(=╯▽╰=) 有时候想一个好的函数名是很痛苦的事啊,尤其是相同功能却又不得不~~~