Go语言映射(Map)与面向对象编程

64 阅读4分钟

Go语言是一门兼具简洁性与高性能的现代编程语言,内置了诸如映射(Map)与结构体等功能,以支持高效的数据管理与面向对象编程(OOP)。本文将从映射的基本用法讲起,深入到结构体、方法等面向对象的核心特性。

一、映射(Map)

1. map 的引入

Map 是 Go 语言内置的数据结构,用于存储一组键值对(key-value)。我们可以通过 key 快速查找对应的 value。典型应用如学生学号和学生姓名的映射关系。

2. map 的基本语法

var 变量名 map[keyType]valueType

Key 支持的类型:bool、数字、string、指针、channel,以及包含这些类型的数组、结构体、接口。

Value 支持的类型:数字、字符串、结构体、map 等。

限制:key 不能是 slice、map 或 function 类型。

3. map 的特点

map 在使用前必须使用 make 初始化。

key-value 对在 map 中是无序的。

key 不可重复;重复赋值会覆盖旧值。

value 可以重复。

make 函数的第二个参数为初始容量,非必需。

二、map 的创建方式

方式一:声明后初始化

var a map[int]string

a = make(map[int]string, 10)

a[2023028] = "张三"

方式二:使用简短声明

b := make(map[int]string)

b[2023028] = "张三"

方式三:直接初始化

c := map[int]string{

    2023028: "张三",

    2023027: "王五",

}

三、map 的常用操作

1. 增加或更新

map[key] = value

若 key 不存在,则为新增;若已存在,则为修改。

2. 删除

delete(map, key)

若 key 存在,删除该键值对;若不存在,不报错。

3. 清空 map

遍历 key,逐个删除;

或者重新创建一个新的 map:

map = make(map[keyType]valueType)

4. 查找

value, ok := map[key]

ok 为布尔值,表示是否查找到 key。

5. 获取长度

len(map)

四、面向对象编程(OOP)在 Go 中的实现

1. Go 的 OOP 特性简介

虽然 Go 没有传统的 class,但通过 struct 与方法(method)的组合,实现了封装、继承与多态等面向对象的核心特性:

无需构造函数、析构函数

无方法重载

无 this 指针

无 extends,但支持“组合式继承”(匿名字段)

 

五、结构体的使用

1. 使用变量管理数据的缺点

var name string = "张三"var age int = 30var sex string = "男"

缺点:字段分散,不利于统一管理。

2. 使用结构体集中管理

type Teacher struct {

    Name   string

    Age    int

    School string

}

func main() {

    var t1 Teacher

    t1.Name = "张三"

    t1.Age = 30

    t1.School = "清华大学"

    fmt.Println(t1)

}

3. 结构体的创建方式

方式一:直接赋值

var t Teacher = Teacher{"张三", 30, "清华大学"}

方式二:指针方式(new)

var t *Teacher = new(Teacher)

(*t).Name = "张三"

t.School = "清华大学"  // 简化写法,底层转换为 (*t).School

fmt.Println(*t)

方式三:字面量初始化指针

var t *Teacher = &Teacher{"张三", 30, "清华大学"}

fmt.Println(*t)

 

六、结构体之间的转换

1. 字段完全相同时支持强转

type Student struct {

    Age int

}type Person struct {

    Age int

}

func main() {

    var s Student = Student{10}

    var p Person = Person{10}

    s = Student(p)  // 手动转换

    fmt.Println(s)

}

2. 类型重定义支持强转

type Student struct {

    Age int

}type Stu Student

func main() {

    var s1 Student = Student{19}

    var s2 Stu = Stu{19}

    s1 = Student(s2)  // 手动转换

    fmt.Println(s1)

}

 

七、方法的引入与绑定

1. 定义与调用格式

type A struct {

    Num int

}

func (a A) test() {

    fmt.Println(a.Num)

}

func main() {

    var a A

    a.test()

}

说明:

(a A) 表示该方法绑定到类型 A 上。

test() 是 A 的一个方法。

2. 示例:结构体绑定方法

type Person struct {

    Name string

}

func (p Person) test() {

    fmt.Println(p.Name)

}

方法必须由结构体对象调用。

属于“值接收者”方式,即方法接收的是结构体的副本。

 

八、方法的注意事项

结构体是值类型,方法调用默认传值,不会修改原值

若需修改结构体字段,应使用指针接收者:

func (p *Person) updateName() {

           p.Name = "李四"

}

所有自定义类型(不仅限于 struct),都可以拥有方法。

方法访问控制与函数相同:

方法名首字母大写:对外可见

方法名首字母小写:包内可见

若结构体实现了 String() 方法,fmt.Println() 会自动调用它的返回值。

 

结语

Go 语言通过结构体和方法巧妙地实现了面向对象的编程思想,同时 map 提供了强大灵活的键值对数据管理方式。熟练掌握这些特性,将大大提升 Go 编程的效率与可维护性。