迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Go >

Go 面向对象 - Structs 替代 Classes

作者:迹忆客 最近更新:2023/01/08 浏览次数:

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  

go mod 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 命令oop执行结果

上面就是Go中使用结构体代替类,在 Go 面向对象-New() 函数 替代 构造函数 这篇文章中来了解Go中的构造函数。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C# 中的 goto 语句

发布时间:2024/02/02 浏览次数:184 分类:编程语言

本教程演示了如何在 C# 中使用 goto 以及何时使用它会有所帮助本教程将演示如何在 C# 中使用 goto 语法,并提供一些代码中的实际使用示例。

在 Python 中是否存在 goto 语句

发布时间:2023/12/20 浏览次数:197 分类:Python

本文为你提供了 Python 中是否存在 goto 语句的答案。本文为你提供了 Python 中是否存在 goto 语句的答案。基本上,Python 不支持 goto 语句。

C++ 中 Struct 和 Typedef Struct 的区别

发布时间:2023/08/27 浏览次数:126 分类:C++

This is a brief article about the difference between struct and typedef struct in C++.这篇小文章将讨论 C++ 中的关键字 typedef。 我们还将讨论 C++ 中简单结构和 typedef 结构之间的区别。C/C++ 中的 typedef 关键字 type

Java Goto

发布时间:2023/08/07 浏览次数:83 分类:Java

与其他编程语言不同,Java 没有 goto。 相反,Java 包含关键字 label。关键字 label 的作用是改变程序的流程,根据指定的条件跳转到程序的另一段。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便