go语言的魔幻旅程08-方法

235 阅读3分钟

闻道有先后,术业有专攻

古人有言:“闻道有先后,术业有专攻”,然则在现今的这个社会,单纯的指望掌握一门技巧就能走遍天下通吃的想法已然过时,随着社会的发展,不管是哪行哪业,不说发生了沧海桑田的巨变,相对大的变化还是有的。社会的大方向如此,作为个体的我们不能一味的埋头干活,有的时候也要抬头看路。微软的windows系统在国内刚开始大范围使用的时候,顺带着带火了自家的编程语言.net,然而到了今天,.net却早已经式微,任凭你.net的各种奇淫技巧,不好意思市场没有需求了。现今的当红炸子鸡,有可能明日就会成为昨日黄花,所以啊,多门手艺多条路还是不错的。放眼望去,go这门编程语言还是非常有发展钱景的。所以不要犹豫了,赶紧搞起来!


方法

1、什么是方法?

方法其实就是一个函数,只是在func这个关键字和方法名中间加入了一个特殊的接收器类型。接收器可以是结构体类型也可以是非结构体类型,同时接收器是可以在方法的内部进行访问的。

//举个方法的定义的栗子
func (t Type) methodName(parameter list) {
}

//举个结构体作为接收器的栗子
type Employee struct {
    name     string
    salary   int
    currency string
}

/*
  displaySalary() 方法将 Employee 做为接收器类型
*/
func (e Employee) displaySalary() {
    fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary)
}

func main() {
    emp1 := Employee {
        name:     "Sam Adolf",
        salary:   5000,
        currency: "$",
    }
    emp1.displaySalary() // 调用 Employee 类型的 displaySalary() 方法
}

值接收器和指针接收器

1、两者的区别?

值接收器和指针接收器的区别在于在指针接收器中方法内部的改变对外部的调用者是可见的,而值接收器是不可以的。

type Employee struct {
    name string
    age  int
}

/*
使用值接收器的方法。
*/
func (e Employee) changeName(newName string) {
    e.name = newName
}

/*
使用指针接收器的方法。
*/
func (e *Employee) changeAge(newAge int) {
    e.age = newAge
}

func main() {
    e := Employee{
        name: "Mark Andrew",
        age:  50,
    }
    fmt.Printf("Employee name before change: %s", e.name)
    e.changeName("Michael Andrew")
    fmt.Printf("\nEmployee name after change: %s", e.name)

    fmt.Printf("\n\nEmployee age before change: %d", e.age)
    (&e).changeAge(51)
    fmt.Printf("\nEmployee age after change: %d", e.age)
}

内嵌类型的方法和继承

1、什么是方法的内嵌和继承?

当一个匿名字段的类型被内嵌在结构体中共的时候,匿名类型的可见方法也同样被内嵌,效果上等同于面向对象的语言实现了继承。

//举个栗子
type Engine interface {
    Start()
    Stop()
}

type Car struct {
    Engine
}

func (c *Car) GoToWorkIn() {
    c.Start()
    c.Stop()
}


//多重继承
type Camera struct{}

func (c *Camera) TakeAPicture() string {
    return "Click"
}

type Phone struct{}

func (p *Phone) Call() string {
    return "Ring Ring"
}

type CameraPhone struct {
    Camera
    Phone
}

func main() {
    cp := new(CameraPhone)
    fmt.Println("Our new CameraPhone exhibits multiple behaviors...")
    fmt.Println("It exhibits behavior of a Camera: ", cp.TakeAPicture())
    fmt.Println("It works like a Phone too: ", cp.Call())
}

小结

方法这部分是特别重要的,不仅涉及到到值传递的方式而且还涉及到指针传递的方式,除此之外方法从某种程度上而言实现了面向对象的许多特性,例如继承,封装,方法与结构体之间的整合,这部分的内容基本上都涉及到了,从这一点上而言方法这部分的内容也是必须要拿下的。