Go语言的封装和继承 | 青训营笔记

70 阅读3分钟

Go语言的封装

在Go语言中,封装是通过将结构体和方法定义在同一个包中来实现的。这意味着只有在同一个包中的代码才能访问结构体的字段和方法。

下面是一个简单的例子,展示了如何定义一个封装的结构体和方法:

package mypackage

type Person struct {
    name string
    age  int
}

func (p *Person) SetName(name string) {
    p.name = name
}

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

在这个例子中,我们将Person结构体和SetNameGetName方法定义在mypackage包中。这意味着只有在mypackage包中的代码才能访问Person结构体的name字段和SetNameGetName方法。

要创建一个Person对象并设置其姓名,可以按照以下方式编写代码:

p := &mypackage.Person{Age: 25}
p.SetName("Alice")
name := p.GetName()

这将创建一个名为pPerson对象,它的年龄为25。然后,我们调用SetName方法来设置其姓名为Alice,并调用GetName方法来获取其姓名。

Go语言的继承

在Go语言中,没有传统意义上的继承机制,但可以通过组合和接口嵌入来实现类似继承的效果。

下面是一个简单的例子,展示了如何使用组合来实现类似继承的效果:

type Animal struct {
    Name string
}

func (a *Animal) Speak() {
    fmt.Println("...")
}

type Dog struct {
    Animal
}

func (d *Dog) Speak() {
    fmt.Println("Woof!")
}

在这个例子中,我们定义了一个名为Animal的结构体,它有一个名为Name的字段和一个名为Speak的方法。我们还定义了一个名为Dog的结构体,它包含了一个Animal类型的字段。Dog结构体也有一个名为Speak的方法,它覆盖了Animal结构体的Speak方法。

要创建一个Dog对象并调用Speak方法,可以按照以下方式编写代码:

go复制代码
d := &Dog{Animal{Name: "Fido"}}
d.Speak()

这将创建一个名为dDog对象,它的NameFido。然后,我们调用Speak方法来打印出Woof!

除了使用组合,还可以使用接口嵌入来实现类似继承的效果。下面是一个简单的例子,展示了如何使用接口嵌入来实现类似继承的效果:

go复制代码
type Animal interface {
    Speak()
}

type Dog struct {
    Name string
}

func (d *Dog) Speak() {
    fmt.Println("Woof!")
}

type TalkingDog struct {
    *Dog
}

func (td *TalkingDog) Speak() {
    fmt.Println("Hello, my name is", td.Name)
    td.Dog.Speak()
}

在这个例子中,我们定义了一个名为Animal的接口,它有一个名为Speak的方法。我们还定义了一个名为Dog的结构体,它有一个名为Name的字段和一个名为Speak的方法。最后,我们定义了一个名为TalkingDog的结构体,它包含了一个指向Dog类型的指针。TalkingDog结构体也有一个名为Speak的方法,它覆盖了Dog结构体的Speak方法。

要创建一个TalkingDog对象并调用Speak方法,可以按照以下方式编写代码:

td := &TalkingDog{Dog: &Dog{Name: "Fido"}}
td.Speak()

这将创建一个名为tdTalkingDog对象,它的NameFido。然后,我们调用Speak方法来打印出问候语和Woof!

虽然Go语言没有传统意义上的继承机制,但通过组合和接口嵌入,我们可以实现类似继承的效果。