Go 面向对象 - Structs 替代 Classes
Go 语言是面向对象的吗?
Go不是纯面向对象的编程语言。 从Go的常见问题解答获取的摘录回答了是否是面向对象的问题。
是也不是。 虽然Go具有类型和方法,允许面向对象的编程风格,但没有类型的层次结构。
Interface
的概念提供了一种不同的方法,我们相信易于使用,并且在某种程度上更加一般。 还有方法可以在其他类型中嵌入类型,以提供类似于但不相同的子类模式。 此外,Go的方法比C++或Java更常见:可以为任何类型的数据定义,甚至内置类型,例如普通的类型,unboxed
整数。 它们不限于structs(classes)。
在接下来的文章中,我们将讨论面向对象的编程概念,是如何使用Go实现的。 与其他面向对象的语言(如Java)相比,它们中的一些在实施中有很大差异。
使用 Structs 代替 Classes
Go不提供 class,但它确实提供了 struct。 可以在结构体 上添加方法。 这提供了将数据和对数据进行操作的方法捆绑在一起的行为,类似于类。
让我们立即从一个例子开始,以便更好地理解。
我们将在这个例子中创建一个自定义包,因为它有助于更好地理解 struct 如何有效地替代 class。
在 src
中创建一个子文件夹并将其命名为 oop。
让我们初始化一个名为 oop 的 go 模块。 在 oop 目录中键入以下命令以创建一个名为 oop 的 go mod。
$ mkdir oop
$ cd oop
$ go mod init oop
在oop内创建一个子文件夹 employee。 在 employee 文件夹中,创建一个名为 employee.go 的文件。
文件夹结构看起来像
├── src
│ └── oop
│ ├── employee
│ │ └── employee.go
│ └── go.mod
请用以下内容替换employee.go的内容
employee.go
package employee import ( "fmt" ) type Employee struct { FirstName string LastName string TotalLeaves int LeavesTaken int } func (e Employee) LeavesRemaining() { fmt.Printf("%s %s has %d leaves remaining\n", e.FirstName, e.LastName, (e.TotalLeaves - e.LeavesTaken)) }
在上面的程序中,第1行指定此文件属于 employee 包。第7行声明了一个 Employee
结构体。第14行的 Employee 结构体中添加了一个名为 LeavesMaining
的方法。这将计算并显示员工的剩余假期数。现在我们有了一个结构体和一个方法,它在一个捆绑在一起的结构体上运行,类似于一个类。
在oop文件夹中创建一个名为main.go的文件。
现在文件夹结构看起来像
├── src
│ └── oop
│ ├── employee
│ │ └── employee.go
│ ├── go.mod
│ └── main.go
下面是 main.go 的内容。
main.go
package main import "oop/employee" func main() { e := employee.Employee { FirstName: "Sam", LastName: "Adolf", TotalLeaves: 30, LeavesTaken: 20, } e.LeavesRemaining() }
我们在第3行导入 employee 包。Employee
结构体的leavesMaining()
方法是从main()
中的第12行调用的。
此程序无法在 playground 运行,因为它具有自定义包。如果在本地运行此程序,然后执行下面的命令
$ go install oop
程序将打印输出如下内容
Sam Adolf has 10 leaves remaining
上面就是Go中使用结构体代替类,在 Go 面向对象-New() 函数 替代 构造函数 这篇文章中来了解Go中的构造函数。
相关文章
使用 C 语言中的 goto 语句
发布时间:2023/05/07 浏览次数:79 分类:C语言
-
本文介绍了如何在 C 语言中使用 goto 语句。使用 goto 语句在 C 语言中实现循环 goto 关键字是 C 语言的一部分,它提供了一个做无条件跳转的结构。
C中Struct和Typedef Struct的前向声明及区别
发布时间:2023/05/06 浏览次数:125 分类:C语言
-
这篇简短的文章讨论了 struct 和 typedef 结构之间的区别。 它进一步阐述了 C 中前向声明的概念。
Django 中的 Slug
发布时间:2023/05/04 浏览次数:173 分类:Python
-
本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。
在 Django 中按降序过滤查询集中的项目
发布时间:2023/05/04 浏览次数:157 分类:Python
-
在这个讲解中,学习如何借助 Django 中的 order_by() 方法按降序过滤出查询集中的项目。
Django ALLOWED_HOSTS 介绍
发布时间:2023/05/04 浏览次数:181 分类:Python
-
本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。
Django 中的 Select_related 方法
发布时间:2023/05/04 浏览次数:129 分类:Python
-
本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。
使用 Post 请求将数据发送到 Django 服务器
发布时间:2023/05/04 浏览次数:159 分类:Python
-
在这篇关于Django的讲解中,我们简要介绍了post和get请求以及如何在Django中用post实现CSRF token。
Django 返回 JSON
发布时间:2023/05/04 浏览次数:106 分类:Python
-
在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。