【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 的新文件:
【Go语言开发】如何使用 Go 模块
介绍
在 1.13 版本中,Go 的作者添加了一种管理 Go 项目所依赖的库的新方法,称为 Go 模块。添加 Go 模块是为了满足日益增长的需求,以使开发人员更容易维护各种版本的依赖项,并为开发人员在计算机上组织项目的方式增加更多灵活性。 Go 模块通常由一个项目或库组成,并包含一组 Go 包,然后一起发布。 Go 模块通过允许用户将项目代码放在他们选择的目录中并为每个模块指定依赖项的版本来解决原始系统 GOPATH 的许多问题。
在本教程中,您将创建自己的公共 Go 模块并将包添加到新模块。此外,您还将其他人的公共模块添加到您自己的项目中,以及将该模块的特定版本添加到您的项目中。
先决条件
要遵循本教程,您将需要:
【Go语言开发】如何分发 Go 模块
介绍
许多现代编程语言允许开发人员分发现成的库供其他人在他们的程序中使用,Go 也不例外。虽然某些语言使用中央存储库来安装这些库,但 Go 从用于创建库的同一版本控制存储库分发它们。 Go 还使用称为语义版本控制的版本控制系统向用户显示何时以及进行了哪些更改。这有助于用户了解模块的较新版本是否可以安全地快速升级,并有助于确保他们的软件继续与模块一起工作。
在本教程中,您将创建和发布新模块,学习使用语义版本控制,并发布模块的语义版本。
先决条件
【Go语言开发】如何在你自己的项目中使用私有 Go 模块
介绍
Go 生态系统的一个有利方面是大量模块是开源的。由于它们是开源的,因此可以自由访问、检查、使用和学习。但是,有时出于各种原因需要制作私有 Go 模块,例如将专有业务逻辑保留在公司内部。
在本教程中,您将发布私有 Go 模块,设置身份验证以访问私有模块,并在项目中使用私有 Go 模块。
先决条件
【Go语言高级开发】如何在 Go 中使用泛型
介绍
在 Go 1.18 中,该语言引入了一个名为泛型类型(通常简称为泛型)的新特性,该特性在 Go 开发人员的愿望清单上已有一段时间了。在编程中,泛型类型是可以与多种其他类型结合使用的类型。通常在 Go 中,如果您希望能够对同一个变量使用两种不同的类型,则需要使用特定的接口,例如 io.Reader,或者使用允许使用任何值的 interface{} .但是,使用 interface{} 可能会使处理这些类型变得困难,因为您需要在其他几种潜在类型之间进行转换才能与它们交互。使用泛型类型可以让你直接与你的类型进行交互,从而使代码更清晰、更易于阅读。
在本教程中,您将创建一个与一副纸牌交互的程序。您将首先创建一个使用 interface{} 与卡片交互的卡片组,然后您将更新它以使用泛型类型。在这些更新之后,您将使用泛型将第二种类型的卡片添加到您的套牌中,然后您将更新您的套牌以将其泛型类型限制为仅支持卡片类型。最后,您将创建一个使用您的卡片并支持泛型类型的函数。
先决条件
要遵循本教程,您将需要:
【Go语言开发】如何在 Go 中转换数据类型
介绍
在 Go 中,数据类型用于对一种特定类型的数据进行分类,确定可以分配给该类型的值以及可以对其执行的操作。在编程时,有时您需要在类型之间转换值以便以不同的方式操作值。例如,您可能需要将数值与字符串连接起来,或者在初始化为整数值的数字中表示小数位。用户生成的数据通常会自动分配为字符串数据类型,即使它由数字组成;为了在此输入中执行数学运算,您必须将字符串转换为数字数据类型。
由于 Go 是一种静态类型语言,因此数据类型绑定到变量而不是值。这意味着,如果将变量定义为 int,则它只能是 int;如果不转换变量的数据类型,就无法为其分配字符串。 Go 中数据类型的静态特性使得学习转换它们的方法更加重要。
本教程将指导您完成数字和字符串的转换,并提供示例以帮助您熟悉不同的用例。
转换数字类型
Go 有多种数字类型可供选择。它们主要分为两种一般类型:整数和浮点数。
【Go语言开发】理解 Go 中的Map
大多数现代编程语言都有字典或哈希类型的概念。这些类型通常用于将数据与映射到值的键成对存储。
在 Go 中,map 数据类型是大多数程序员认为的字典类型。它将键映射到值,生成键值对,这是在 Go 中存储数据的有用方式。映射是通过使用关键字 map 后跟方括号 [ ] 中的键数据类型,然后是值数据类型来构造的。然后将键值对放在 { } 两侧的花括号内:
map[key]value{}
您通常在 Go 中使用地图来保存相关数据,例如 ID 中包含的信息。带有数据的地图如下所示:
map[string]string{"name": "Sammy", "animal": "shark", "color": "blue", "location": "ocean"}
除了花括号之外,整个映射中还有冒号连接键值对。冒号左边的词是键。键可以是 Go 中任何可比较的类型,例如字符串、整数等。
示例地图中的键是:
【Go语言开发】理解 Go 中的数组和切片
介绍
在 Go 中,数组和切片是由有序的元素序列组成的数据结构。当您想要处理许多相关值时,这些数据集合非常适合使用。它们使您能够将属于一起的数据保存在一起,压缩您的代码,并一次对多个值执行相同的方法和操作。
尽管 Go 中的数组和切片都是元素的有序序列,但两者之间存在显着差异。 Go 中的数组是一种数据结构,由有序的元素序列组成,其容量在创建时定义。一旦数组分配了它的大小,就不能再改变大小。另一方面,切片是数组的可变长度版本,为使用这些数据结构的开发人员提供了更大的灵活性。切片构成了您在其他语言中所认为的数组。
鉴于这些差异,在某些特定情况下您会使用其中一种。如果您是 Go 新手,确定何时使用它们可能会令人困惑:尽管切片的多功能性使它们在大多数情况下成为更合适的选择,但在某些特定情况下,数组可以优化程序的性能。
本文将详细介绍数组和切片,这些阵列和切片将为您提供必要的信息,以在这些数据类型之间进行选择时做出适当的选择。此外,您将回顾最常见的声明和使用数组和切片的方法。本教程将首先提供数组的描述以及如何操作它们,然后解释切片及其不同之处。