长安链 DApp 开发必学 Go 07

142 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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())
}

聪明的朋友可能会问了,如果我想实现“修改类的属性值”这种功能,要怎么实现呢?

下一章揭晓~