Administrator
发布于 2024-05-11 / 0 阅读
0

golang struct实现面向对象

匿名字段

可以将一个结构体类型作为另一个结构体类型的字段,这个字段就称为匿名字段。匿名字段的类型可以是任意类型,可以是基本类型、结构体类型、指针类型等。匿名字段可以直接访问内部结构体的字段,也可以通过内部结构体名来访问内部结构体的字段。

type Address struct {
    Province string
    City     string
}

type Person struct {
    Name string
    Age  int
    Address
}

p := Person{Name: "Tom", Age: 18, Address: Address{Province: "Beijing", City: "Chaoyang"}}
fmt.Println(p.Name, p.Age, p.Province, p.City)

面向对象

Go语言虽然不是一种纯面向对象编程语言,但它提供了一些面向对象编程的基本特性,比如封装、继承和多态等。

封装

Go语言通过大写字母开头的字段或方法来实现封装,这些字段或方法可以在包外部访问。小写字母开头的字段或方法则只能在当前包内部访问。

package main

import "fmt"

type Person struct {
    name string
    age int
}

func (p *Person) SayHello() {
    fmt.Println("Hello, my name is", p.name, ", I'm", p.age, "years old.")
}

func main() {
    p := &Person{"Tom", 18}
    p.SayHello()
}

在上面的代码中,我们定义了一个名为Person的结构体,它有两个字段name和age,并且定义了一个方法SayHello,用于打印个人信息。在main函数中,我们创建了一个Person对象p,并调用它的SayHello方法,输出了它的信息。

继承

Go语言不支持传统的继承方式,但是可以通过结构体组合的方式实现继承。具体来说,我们可以在一个结构体中包含另一个结构体,并通过嵌套结构体的方式来继承其字段和方法。

package main

import "fmt"

type Person struct {
    name string
    age  int
}

func (p *Person) SayHello() {
    fmt.Println("Hello, my name is", p.name, ", I'm", p.age, "years old.")
}

type Student struct {
    Person
    score int
}

func main() {
    s := &Student{Person{"Tom", 18}, 90}
    s.SayHello()
    fmt.Println("My score is", s.score)
}

在上面的代码中,我们定义了两个结构体Person和Student,Student结构体包含了一个Person类型的字段,并且定义了一个自己的score字段。在main函数中,我们创建了一个Student对象s,并调用它的SayHello方法,输出了它的信息,然后输出了它的成绩。

多态

Go语言不支持传统的多态方式,但是可以通过接口实现多态。具体来说,我们可以定义一个接口,并让不同的结构体实现这个接口,从而实现多态。

package main

import "fmt"

type Animal interface {
    Say()
}

type Cat struct{}

func (c *Cat) Say() {
    fmt.Println("Meow!")
}

type Dog struct{}

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

func main() {
    var a Animal
    a = &Cat{}
    a.Say()

    a = &Dog{}
    a.Say()
}

这段Go语言代码定义了一个Animal接口和两个实现了该接口的结构体:Cat和Dog。Animal接口中只有一个Say()方法。Cat和Dog分别实现了Say()方法并输出相应的声音。在main函数中,定义了一个a变量,类型为Animal接口。首先将a赋值为一个Cat结构体的指针,然后调用a的Say()方法输出"Meow!"。接着将a赋值为一个Dog结构体的指针,再次调用a的Say()方法输出"Woof!"