映射(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 结构体的字段和方法。