GO的映射和面向对象|青训营

91 阅读3分钟

映射(Map):

  • 映射是一种无序的键值对集合。在 Go 语言中,映射是基于哈希表实现的数据结构。
  • 使用 make() 函数可以创建一个映射。例如:m := make(map[keyType]valueType)
  • keyType 是键的类型,valueType 是值的类型。每个键必须是唯一的,但值可以重复。
  • 使用键来访问和修改映射中的值。例如:value := m[key]m[key] = value
  • 对于不存在的键,访问时会返回值类型的零值。可以使用 delete() 函数从映射中删除指定的键值对。

以下是一个使用代码示例来说明映射的基本概念和操作:

package main

import "fmt"

func main() {
    // 创建一个空的映射
    m := make(map[string]int)

    // 添加键值对到映射中
    m["apple"] = 10
    m["banana"] = 5
    m["orange"] = 8

    // 获取映射中的值
    fmt.Println("apple:", m["apple"])
    
    // 修改映射中的值
    m["banana"] = 3
    fmt.Println("banana:", m["banana"])

    // 删除映射中的键值对
    delete(m, "orange")
    fmt.Println("orange:", m["orange"])

    // 检查映射中的键是否存在
    value, exists := m["banana"]
    if exists {
        fmt.Println("Value of banana:", value)
    } else {
        fmt.Println("banana not found")
    }

    // 迭代映射中的键值对
    for key, value := range m {
        fmt.Println(key, ":", value)
    }
}

在上述代码中,我们创建了一个名为 m 的映射,并向其中添加了几个键值对。接着,我们展示了如何访问和修改映射中的值,并演示了如何使用 delete() 函数删除映射中的键值对。然后,我们通过示例展示了如何检查映射中的键是否存在。最后,使用 range 关键字迭代映射中的键值对,并打印出每个键值对。

面向对象:

Go 语言原生不支持类和继承的面向对象编程范式,但可以通过结构体和方法来实现面向对象的概念。

结构体(Struct):

  • 结构体是一种用户定义的类型,用于封装一组相关的数据字段。它由一系列字段组成,每个字段都有自己的名称和类型。
  • 通过定义结构体来创建自定义类型。例如:type Person struct { name string }
  • 结构体可以包含任意数量的字段,并且字段可以是不同的类型。可以通过点操作符 . 来访问和修改结构体中的字段。

方法(Method):

  • 方法是与结构体关联的函数。定义在结构体上的函数称为方法。
  • 方法可以通过接收者来访问和操作结构体的字段。接收者是一个作为方法的第一个参数的特殊类型。
  • 使用 func 关键字定义方法,并指定接收者。例如:func (p *Person) GetName() string { return p.name }
  • 调用方法时,方法能够访问接收者相关的数据。

封装和继承:

Go 语言通过结构体的字段可见性来实现封装。结构体字段可以使用大写字母开头来使其对外可见,即公开的字段。私有字段使用小写字母开头,只能在同一个包中访问。

尽管 Go 语言没有显式的继承概念,但可以通过嵌入结构体的方式实现代码复用和类似继承的行为。这称为组合。通过嵌入结构体,可以在一个结构体中获得另一个结构体的所有字段和方法。

例如:

type Animal struct {
    name string
}

func (a *Animal) Speak() {
    fmt.Println("I'm an animal")
}

type Dog struct {
    Animal // 嵌入 Animal 结构体
    breed  string
}

func main() {
    dog := Dog{
        Animal: Animal{name: "Doggy"},
        breed:  "Labrador",
    }
    fmt.Println(dog.name) // 可以访问嵌入结构体的字段
    dog.Speak()           // 可以调用嵌入结构体的方法
}

在上面的示例中,Dog 结构体嵌入了 Animal 结构体。这使得 Dog 结构体可以访问和继承 Animal 结构体的字段和方法。