📜  Golang 中的类和对象(1)

📅  最后修改于: 2023-12-03 15:31:01.972000             🧑  作者: Mango

Golang 中的类和对象

Golang 是一种面向对象的编程语言,但是它没有类的概念,取而代之的是结构体和方法。

结构体

结构体是一种自定义类型,可以包含多个不同的数据类型。可以通过下面的语法定义结构体:

type Person struct {
    Name string
    Age int
    Address Address
}

在上面的例子中,我们定义了一个名为 Person 的结构体。它有三个成员变量:NameAge 都是基本类型(字符串和整数),Address 是另一个结构体类型。

方法

方法是一种与对象相关联的函数。在 Golang 中,方法是以结构体为接收器的函数。这意味着方法可以访问结构体中的成员变量。

下面是一个定义方法的例子:

func (p *Person) SayHello() {
    fmt.Printf("Hello, my name is %s and I'm %d years old\n", p.Name, p.Age)
}

在上面的例子中,我们定义了一个名为 SayHello 的方法。它的接收器是一个指向 Person 结构体的指针。(注意:指针接收器是必需的,这样我们才能修改结构体的成员变量。)

方法的调用方式与普通函数略有不同:

func main() {
    p := Person{Name: "Alice", Age: 20}
    p.SayHello()
}
继承

虽然 Golang 没有类的概念,但是它可以通过嵌套结构体来实现类似于继承的功能。

例如,我们有两个结构体 CarToyotaCar

type Car struct {
    Name string
    Price int
}

type ToyotaCar struct {
    Car
    Model string
    Year int
}

上面的例子中,ToyotaCar 包含一个 Car 结构体,这意味着 ToyotaCar 可以继承 Car 中的成员变量和方法。

封装

Golang 中使用大小写字母来确定变量或函数是否可以在其他包中被访问。如果以大写字母开头,那么该变量或函数就可以在其他包中使用;如果以小写字母开头,那么就不能在其他包中使用。

例如,我们定义一个名为 Person 的结构体和一个 GetName 方法:

package mypackage

type Person struct {
    name string
    age int
}

func (p *Person) GetName() string {
    return p.name
}

在上面的例子中,我们把 Person 结构体和 GetName 方法放在了 mypackage 包下。由于 Person 结构体和 GetName 方法都是以小写字母开头,因此它们不能在其他包中被访问。

多态

Golang 中的多态是通过接口实现的。接口是一组方法的集合,只包含方法的定义而没有实现。在 Golang 中,如果一个类型实现了某个接口的所有方法,那么它就可以被当做该接口类型来使用。

例如,我们定义了一个名为 Animal 的接口:

type Animal interface {
    Speak() string
}

于是,我们可以定义一个名为 Dog 的结构体,并实现 Animal 接口的 Speak 方法:

type Dog struct {}

func (d *Dog) Speak() string {
    return "Woof!"
}

因为 Dog 结构体实现了 Animal 接口的 Speak 方法,所以它可以被当做 Animal 类型来使用。

总结

虽然 Golang 没有类的概念,但是它通过结构体和方法等特性来实现面向对象编程。这些特性使得编程更加简洁、灵活,同时也保留了面向对象编程的核心思想。