跳转到主要内容

【Go语言开发】如何在 Go 中使用可变参数函数

介绍


可变参数函数是接受零、一个或多个值作为单个参数的函数。 虽然可变参数函数并不常见,但它们可用于使您的代码更清晰、更具可读性。

可变参数函数比看起来更常见。 最常见的是 fmt 包中的 Println 函数。

func Println(a ...interface{}) (n int, err error)


带有以一组省略号 (...) 开头的参数的函数被视为可变参数函数。 省略号表示提供的参数可以是零、一个或多个值。 对于 fmt.Println 包,它声明参数 a 是可变参数。

让我们创建一个使用 fmt.Println 函数并传入零个、一个或多个值的程序:

print.go

【Go语言高级开发】使用构建标签的自定义 Go 二进制文件

介绍


在 Go 中,构建标记或构建约束是添加到一段代码的标识符,用于确定在构建过程中何时应将文件包含在包中。这允许您从相同的源代码构建不同版本的 Go 应用程序,并以快速且有条理的方式在它们之间切换。许多开发人员使用构建标签来改进构建跨平台兼容应用程序的工作流程,例如需要更改代码以解决不同操作系统之间差异的程序。构建标签还用于集成测试,允许您在集成代码和带有模拟服务或存根的代码之间快速切换,以及应用程序中不同级别的功能集。

让我们以不同客户功能集的问题为例。在编写某些应用程序时,您可能希望控制在二进制文件中包含哪些功能,例如提供 Free、Pro 和 Enterprise 级别的应用程序。随着客户在这些应用程序中提高订阅级别,更多功能将解锁并可用。要解决此问题,您可以维护单独的项目并尝试通过使用 import 语句使它们彼此同步。虽然这种方法可行,但随着时间的推移,它会变得乏味且容易出错。另一种方法是使用构建标签。

在本文中,您将使用 Go 中的构建标签生成不同的可执行二进制文件,这些二进制文件提供示例应用程序的免费、专业和企业功能集。每个都有一组不同的可用功能,免费版本是默认设置。

先决条件


要遵循本文中的示例,您将需要:

【Go语言开发】在 Go 中定义Structs (结构)

介绍


围绕具体细节构建抽象是编程语言可以为开发人员提供的最大工具。结构允许 Go 开发人员描述 Go 程序运行的世界。结构体允许我们讨论地址,而不是推理描述街道、城市或邮政编码的字符串。在我们努力告诉未来的开发人员(包括我们自己)哪些数据对我们的 Go 程序很重要以及未来的代码应该如何适当地使用这些数据时,它们充当了文档的天然纽带。结构可以以几种不同的方式定义和使用。在本教程中,我们将了解这些技术中的每一种。

定义结构


结构就像您可能用来报税的纸质表格一样工作。纸质表格可能包含文本信息字段,例如您的名字和姓氏。除了文本字段,表单可能还有复选框来指示布尔值,例如“已婚”或“单身”,或用于出生日期的日期字段。类似地,结构将不同的数据块收集在一起,并将它们组织在不同的字段名称下。当您使用新结构初始化变量时,就好像您已经复印了一个表格并准备好填写。

要创建一个新结构,你必须首先给 Go 一个蓝图,描述结构包含的字段。此结构定义通常以关键字类型开头,后跟结构名称。在此之后,使用 struct 关键字后跟一对大括号 {},您可以在其中声明 struct 将包含的字段。一旦定义了结构,就可以声明使用该结构定义的变量。这个例子定义了一个结构并使用它:

【Go语言开发】在 Go 中定义方法

介绍


函数允许您将逻辑组织成可重复的过程,每次运行时可以使用不同的参数。 在定义函数的过程中,您经常会发现多个函数每次都可能对同一条数据进行操作。 Go 识别这种模式并允许您定义称为方法的特殊函数,其目的是对某种特定类型的实例进行操作,称为接收器。 向类型添加方法使您不仅可以传达数据是什么,还可以传达应该如何使用该数据。

定义一个方法


定义方法的语法类似于定义函数的语法。 唯一的区别是在 func 关键字之后添加了一个额外的参数,用于指定方法的接收者。 接收者是您希望在其上定义方法的类型的声明。 以下示例在结构类型上定义了一个方法:

【Go语言基础】如何构建和安装 Go 程序

介绍


到目前为止,在我们的如何在 Go 中编码系列中,您已经使用命令 go run 来自动编译您的源代码并运行生成的可执行文件。尽管此命令对于在命令行上测试您的代码很有用,但分发或部署您的应用程序需要您将代码构建为可共享的二进制可执行文件,或包含可以运行您的应用程序的机器字节代码的单个文件。为此,您可以使用 Go 工具链来构建和安装您的程序。

在 Go 中,将源代码转换为二进制可执行文件的过程称为构建。构建此可执行文件后,它将不仅包含您的应用程序,还包含在目标平台上执行二进制文件所需的所有支持代码。这意味着 Go 二进制文件不需要系统依赖项(例如 Go 工具)在新系统上运行。将这些可执行文件放在您自己系统上的可执行文件路径中将允许您从系统上的任何位置运行该程序。这与将程序安装到系统上是一样的。

在本教程中,您将使用 Go 工具链来运行、构建和安装示例 Hello, World!程序,允许您有效地使用、分发和部署未来的应用程序。

先决条件


要遵循本文中的示例,您将需要:

【Go语言开发】如何在 Go 中使用结构(Struct) 标签

介绍


结构或结构用于在一个单元中收集多条信息。这些信息集合用于描述更高级别的概念,例如由街道、城市、州和邮政编码组成的地址。当您从数据库或 API 等系统读取此信息时,您可以使用结构标记来控制如何将此信息分配给结构的字段。结构标签是附加到结构字段的小块元数据,为其他使用该结构的 Go 代码提供指令。

结构标签是什么样的?


Go 结构标记是出现在 Go 结构声明中的类型之后的注释。每个标签都由与某个对应值相关联的短字符串组成。

一个 struct 标签看起来像这样,标签偏移带有反引号 ` 字符:

type User struct {
    Name string `example:"name"`
}


然后其他 Go 代码能够检查这些结构并提取分配给它请求的特定键的值。如果没有检查它们的附加代码,结构标记对代码的操作没有影响。

试试这个例子,看看结构标签是什么样子的,如果没有来自另一个包的代码,它们将不起作用。

【Go语言开发】如何在 Go 中使用接口

介绍


编写灵活、可重用和模块化的代码对于开发通用程序至关重要。以这种方式工作可以避免在多个地方进行相同的更改,从而确保代码更易于维护。你如何做到这一点因语言而异。例如,继承是 Java、C++、C# 等语言中使用的一种常见方法。

开发人员也可以通过组合实现相同的设计目标。组合是一种将对象或数据类型组合成更复杂的类型的方法。这是 Go 用来促进代码重用、模块化和灵活性的方法。 Go 中的接口提供了一种组织复杂组合的方法,学习如何使用它们将使您能够创建通用的、可重用的代码。

在本文中,我们将学习如何组合具有共同行为的自定义类型,这将允许我们重用我们的代码。我们还将学习如何为我们自己的自定义类型实现接口,以满足从另一个包定义的接口。

定义行为


组合的核心实现之一是接口的使用。接口定义了一种类型的行为。 Go 标准库中最常用的接口之一是 fmt.Stringer 接口:

【Go语言高级开发】为不同的操作系统和架构构建 Go 应用程序

介绍

在软件开发中,重要的是要考虑您希望为其编译二进制文件的操作系统和底层处理器架构。由于在不同的操作系统/架构平台上运行二进制文件通常很慢或不可能,因此为许多不同的平台构建最终二进制文件以最大化程序的受众是一种常见的做法。但是,当您用于开发的平台与您要将程序部署到的平台不同时,这可能会很困难。例如,在过去,在 Windows 上开发程序并将其部署到 Linux 或 macOS 机器将涉及为您想要二进制文件的每个环境设置构建机器。除了会增加成本并使协作测试和分发更加困难的其他考虑因素之外,您还需要保持工具同步。

Go 通过直接在 Go 构建工具以及 Go 工具链的其余部分中构建对多个平台的支持来解决这个问题。通过使用环境变量和构建标签,您可以控制构建最终二进制文件的操作系统和架构,此外还可以组合一个工作流,该工作流可以在不更改代码库的情况下快速切换平台相关代码的包含。

在本教程中,您将组装一个示例应用程序,它将字符串连接到一个文件路径中,创建并选择性地包含平台相关的片段,并为您自己的系统上的多个操作系统和系统架构构建二进制文件,向您展示如何使用这个强大的Go 编程语言的能力。

先决条件


要遵循本文中的示例,您将需要:

【Go语言高级开发】使用 ldflags 为 Go 应用程序设置版本信息

介绍


在将应用程序部署到生产环境中时,使用版本信息和其他元数据构建二进制文件将通过添加标识信息来帮助跟踪您的构建,从而改进您的监控、日志记录和调试过程。此版本信息通常可以包括高度动态的数据,例如构建时间、构建二进制文件的机器或用户、构建它的版本控制系统 (VCS) 提交 ID 等等。由于这些值不断变化,因此将这些数据直接编码到源代码中并在每次新构建之前对其进行修改是乏味的并且容易出错:源文件可以四处移动,变量/常量可能会在整个开发过程中切换文件,从而中断构建过程。

在 Go 中解决此问题的一种方法是使用 -ldflags 和 go build 命令在构建时将动态信息插入二进制文件,而无需修改源代码。在这个标志中,ld 代表链接器,该程序将编译的源代码的不同部分链接到最终的二进制文件中。因此,ldflags 代表链接器标志。之所以这样称呼它,是因为它将一个标志传递给底层的 Go 工具链链接器 cmd/link,它允许您在构建时从命令行更改导入包的值。

在本教程中,您将使用 -ldflags 在构建时更改变量的值,并将您自己的动态信息引入二进制文件,使用将版本信息打印到屏幕的示例应用程序。

先决条件


要遵循本文中的示例,您将需要:

【Go语言开发】如何在 Go 中使用 flag 包

介绍


如果没有额外的配置,命令行实用程序很少开箱即用。好的默认值很重要,但有用的实用程序需要接受用户的配置。在大多数平台上,命令行实用程序接受标志来自定义命令的执行。标志是在命令名称之后添加的键值分隔字符串。 Go 允许您使用标准库中的标志包来制作接受标志的命令行实用程序。

在本教程中,您将探索使用 flag 包构建不同类型的命令行实用程序的各种方法。您将使用标志来控制程序输出,在混合标志和其他数据时引入位置参数,然后实现子命令。

使用标志(flag )来改变程序的行为


使用 flag 包涉及三个步骤:首先,定义变量以捕获标志值,然后定义您的 Go 应用程序将使用的标志,最后,解析在执行时提供给应用程序的标志。 flag 包中的大多数函数都涉及定义标志并将它们绑定到您定义的变量。解析阶段由 Parse() 函数处理。

为了说明,您将创建一个程序,该程序定义一个布尔标志,该标志更改将打印到标准输出的消息。如果提供了 -color 标志,程序将以蓝色打印一条消息。如果没有提供标志,则消息将不带任何颜色打印。

创建一个名为 boolean.go 的新文件: