开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:github.com/weopenproje…
前面一系列的文章介绍完了 go 的数据结构:结构体 struct、切片 slice 和哈希表 map。
合理的利用这些数据结构,可以让我们便捷且高效的组织、操作数据,来更好的实现所需要的逻辑。
ok,我们已经掌握了 go 的基础语法、控制流和数据结构,现在万事俱备,兴奋的朋友是不是已经摩拳擦掌,准备大干一番。
且慢,目前所学的关于 go 的知识只能供我们写出简单的、小规模的程序。如果要编写大型的工程项目,我们还需要学习编程范式。
编程范式是什么鬼?我说个名词,大名鼎鼎的——面向对象程序设计 OOP。作为一个合格的程序员,对 OOP 应该是耳熟能详。
随着工程项目的代码量和复杂度的提高,没有一个合理的编程范式进行指导,工程项目将变得难以维护和更新,这往往是大型工程项目走向灭亡的原因。
面向对象程序设计 OOP,作为一种大量工程实践总结、归纳出的产物,被证明是解决大型项目问题的好方法。甚至有例如 JAVA 等语言,强制开发者必须使用面向对象程序设计来进行开发,这也是大公司倾向于使用 JAVA 语言的原因,方便了开发者的共同合作。
那么,在 go 语言中,是怎么支持 OOP 的?先来看 go 语言中是怎么实现“类的方法”:
package main
import (
"fmt"
"math"
)
type Vertex struct { // 定义一个结构体
X, Y float64
}
func (v Vertex) Abs() float64 { // 定义 Abs 函数,这个函数的“接收者”为 Vertex
return math.Sqrt(v.X*v.X + v.Y*v.Y) // 调用 Vertex 的属性
}
func main() {
v := Vertex{3, 4} // 初始化 Vertex
fmt.Println(v.Abs()) // 调用 Vertex 的 Abs 方法
}
可以看到,go 语言中是没有“类”(class)这个概念的。通过给函数绑定一个“接收者”(receiver),就实现了“类的方法”这种功能。
当然,你也可以给其他类型的数据绑定方法:
package main
import (
"fmt"
"math"
)
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
func main() {
f := MyFloat(-math.Sqrt2)
fmt.Println(f.Abs())
}
聪明的朋友可能会问了,如果我想实现“修改类的属性值”这种功能,要怎么实现呢?
下一章揭晓~