Go 语言的面向对象 | 青训营笔记

42 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天


method

method 概念

对于 Java 来说,一个类有自己的属性和方法,可以通过定义类的方法来定义类的行为,但是在 go 中,并没有类的概念,更谈不上在类中定义方法了,但是 go 中有一个 method 的概念,和 Java 中类方法的概念没相同。

method 语法

method 是附属在一个给定的类型上的,他的语法和函数的声明语法几乎一样,只是在 func 后面增加了一个 receiver (也就是 method 所依从的主体)。

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

对于 ReceiverType 处的变量,可以使用值传递,也可以使用指针传递,如果使用指针传递的话,是可以改变实例对象的内容,如果使用值传递,并不会对原实例对象发生任何操作。

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() {
    r1 := Rectangle{12, 2}
    r2 := Rectangle{9, 4}
    c1 := Circle{10}
    c2 := Circle{25}

    fmt.Println("Area of r1 is: ", r1.area())
    fmt.Println("Area of r2 is: ", r2.area())
    fmt.Println("Area of c1 is: ", c1.area())
    fmt.Println("Area of c2 is: ", c2.area())
}

interface

interface 概念

在了解的 method 的基本使用后,就可以学习 interface 了,interface 是一组 method 签名的组合,我们通过 interface 来定义对象的一组行为。

type Men interface { 
    SayHi() 
    Sing(lyrics string) 
}

type Human struct { 
    name string 
    age int 
    phone string 
}

// Human 实现 SayHi 方法
func (h Human) SayHi() {
    fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}

// Human 实现 Sing 方法
func (h Human) Sing(lyrics string) {
    fmt.Println("La la la la...", lyrics)
}

interface 语法

  • 接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)。

  • 接口中所有的方法都没有方法体,即都是没有实现的方法。

  • 在Go中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。

  • 一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型。

  • 只要是自定义数据类型就可以实现接口,不仅仅是结构体类型。

  • 一个自定义类型可以实现多个接口。

  • Go接口不能有任何变量。

  • 一个接口可以继承多个别的接口,这时如果要实现这个接口必须实现它继承的所有接口的方法。在低版本的Go编辑器中,一个接口继承其他多个接口时,不允许继承的接口有相同的方法名。比如A接口继承B、C接口,B、C接口的方法名不能一样。高版本的Go编辑器没有相关问题。

  • interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil。

  • 空接口interface{}没有任何方法,所以所有类型都实现了空接口,即我们可以把任何一个变量赋给空接口类型。