Go method 学习

一、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为接收器就可以了。


(=╯▽╰=)  有时候想一个好的函数名是很痛苦的事啊,尤其是相同功能却又不得不~~~








转载于:https://my.oschina.net/jbryan/blog/134256

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值