如何构建和安装 Go 程序

简介

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

在 Go 中,将源代码转换为二进制可执行文件的过程称为构建。一旦构建了这个可执行文件,它将包含不仅您的应用程序,还包括在目标平台上执行二进制文件所需的所有支持代码。这意味着 Go 二进制文件不需要系统依赖项,比如 Go 工具,就可以在新系统上运行。将这些可执行文件放在自己系统上的可执行文件路径上,就可以在系统的任何地方运行程序。这与安装程序到系统上是一样的。

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

先决条件

要按照本文中的示例,您需要:

  • 通过《如何安装 Go 并设置本地编程环境》设置好的 Go 工作区。

步骤 1 —— 设置并运行 Go 二进制文件

首先,创建一个应用程序,用作演示 Go 工具链的示例。为此,您将使用《如何在 Go 中编写您的第一个程序》教程中的经典的 “Hello, World!” 程序。

在您的 src 目录中创建一个名为 greeter 的目录:

mkdir greeter

接下来,进入新创建的目录,并在您选择的文本编辑器中创建 main.go 文件:

cd greeter
nano main.go

文件打开后,添加以下内容:

package mainimport "fmt"func main() {fmt.Println("Hello, World!")
}

运行时,此程序将在控制台打印短语 Hello, World!,然后程序将成功退出。

保存并退出文件。

要测试该程序,使用 go run 命令,就像在之前的教程中所做的那样:

go run main.go

您将收到以下输出:

Hello, World!

如前所述,go run 命令将您的源文件构建成一个可执行二进制文件,然后运行编译后的程序。但是,本教程旨在以一种可以随意共享和分发的方式构建二进制文件。为此,您将在下一步中使用 go build 命令。

步骤 2 —— 创建 Go 模块以构建 Go 二进制文件

Go 程序和库围绕着模块的核心概念构建。一个模块包含有关您的程序使用的库以及要使用的这些库的版本的信息。

为了告诉 Go 这是一个 Go 模块,您需要使用 go mod 命令创建一个 Go 模块:

go mod init greeter

这将创建名为 go.mod 的文件,其中包含模块的名称以及用于构建它的 Go 版本。

go: creating new go.mod: module greeter
go: to add module requirements and sums:go mod tidy

Go 将提示您运行 go mod tidy 以更新此模块的要求,如果它们在将来发生更改。现在运行它将不会有额外的效果。

步骤 3 —— 使用 go build 构建 Go 二进制文件

使用 go build,您可以为我们的示例 Go 应用程序生成一个可执行二进制文件,从而可以在需要的地方分发和部署程序。

尝试使用 main.go。在您的 greeter 目录中,运行以下命令:

go build

如果不向此命令提供参数,go build 将自动编译当前目录中的 main.go 程序。该命令将包括目录中的所有 *.go 文件。它还将构建执行二进制文件所需的所有支持代码,以便能够在具有相同系统架构的任何计算机上执行二进制文件,而不管该系统是否具有 .go 源文件,甚至是否安装了 Go。

在这种情况下,您将您的 greeter 应用程序构建成一个可执行文件,该文件已添加到当前目录。通过运行 ls 命令来检查:

ls

如果您正在运行 macOS 或 Linux,您将找到一个新的可执行文件,该文件的名称与您构建程序的目录相同:

greeter  main.go  go.mod

默认情况下,go build 将为当前平台和架构生成可执行文件。例如,在 linux/386 系统上构建,该可执行文件将与任何其他 linux/386 系统兼容,即使没有安装 Go。Go 支持为其他平台和架构构建,您可以在我们的《为不同操作系统和架构构建 Go 应用程序》文章中了解更多信息。

现在,您已经创建了一个可执行二进制文件,运行它以确保二进制文件已正确构建。在 macOS 或 Linux 上,运行以下命令:

./greeter

在 Windows 上,运行:

greeter.exe

二进制文件的输出将与您使用 go run 运行程序时的输出相匹配:

Hello, World!

现在,您已经创建了一个包含不仅您的程序,还包括运行该二进制文件所需的所有系统代码的单个可执行二进制文件。您现在可以将此程序分发到新系统或将其部署到服务器,知道该文件将始终运行相同的程序。

在下一节中,本教程将解释二进制文件的命名方式以及您如何更改它,以便您可以更好地控制程序的构建过程。

步骤 4 —— 更改二进制文件名称

现在你已经知道如何生成可执行文件,下一步是了解 Go 如何选择二进制文件的名称,并为你的项目自定义这个名称。

当你运行 go build 时,默认情况下,Go 会自动决定生成的可执行文件的名称。它通过使用你之前创建的模块来实现这一点。当运行 go mod init greeter 命令时,它使用名称为 ‘greeter’ 创建了模块,这就是为什么生成的二进制文件也被命名为 greeter

让我们更仔细地看看模块方法。如果你的项目中有一个 go.mod 文件,并且其中有一个 module 声明,如下所示:

module github.com/sammy/shark

那么生成的可执行文件的默认名称将是 shark

在需要特定命名约定的更复杂的程序中,这些默认值并不总是命名你的二进制文件的最佳选择。在这些情况下,最好使用 -o 标志来自定义你的输出。

为了测试这一点,将上一节中创建的可执行文件的名称更改为 hello,并将其放置在一个名为 bin 的子文件夹中。你不需要创建这个文件夹;Go 在构建过程中会自行创建它。

运行以下带有 -o 标志的 go build 命令:

go build -o bin/hello

-o 标志使得 Go 将命令的输出与你选择的任何参数匹配。在这种情况下,结果是一个名为 hello 的新可执行文件,位于名为 bin 的子文件夹中。

为了测试新的可执行文件,切换到新目录并运行二进制文件:

cd bin
./hello

你将收到以下输出:

Hello, World!

现在你可以自定义可执行文件的名称以满足项目的需求,完成了我们关于如何在 Go 中构建二进制文件的调查。但是使用 go build,你仍然受限于只能从当前目录运行你的二进制文件。为了能够从系统的任何位置使用新构建的可执行文件,你可以使用 go install 来安装它们。

步骤 5 —— 使用 go install 安装 Go 程序

到目前为止,在本文中,我们已经讨论了如何从我们的 .go 源文件生成可执行二进制文件。这些可执行文件有助于分发、部署和测试,但目前还不能从它们的源目录之外执行。如果你想要在 shell 脚本或其他工作流中主动使用你的程序,这将是一个问题。为了使程序更易于使用,你可以将它们安装到系统中,并从任何位置访问。

为了理解这意味着什么,你将使用 go install 命令来安装你的示例应用程序。

go install 命令的行为几乎与 go build 相同,但它不会将可执行文件留在当前目录,也不会将其放置在由 -o 标志指定的目录中,而是将其放置在 $GOPATH/bin 目录中。

要找到你的 $GOPATH 目录的位置,运行以下命令:

go env GOPATH

你收到的输出将有所不同,但默认值是你的 $HOME 目录中的 go 目录:

$HOME/go

由于 go install 将生成的可执行文件放置在 $GOPATH 的名为 bin 的子目录中,因此必须将此目录添加到 $PATH 环境变量中。这在先决条件文章《如何安装 Go并设置本地编程环境》的 创建你的 Go 工作区 步骤中有所涉及。

设置好 $GOPATH/bin 目录后,返回到你的 greeter 目录:

cd ..

现在运行安装命令:

go install

这将构建你的二进制文件并将其放置在 $GOPATH/bin 中。为了测试这一点,运行以下命令:

ls $GOPATH/bin

这将列出 $GOPATH/bin 的内容:

greeter

安装了二进制文件后,测试一下程序是否可以从其源目录之外运行。返回到你的主目录:

cd $HOME

使用以下命令运行程序:

greeter

这将产生以下结果:

Hello, World!

现在你可以将你编写的程序安装到系统中,从任何地方使用它们。

结论

在本教程中,你演示了 Go 工具链如何轻松地从源代码构建可执行二进制文件。这些二进制文件可以分发到其他系统上运行,即使这些系统没有 Go 工具和环境。你还使用了 go install 自动构建并安装我们的程序作为可执行文件到系统的 $PATH 中。通过 go buildgo install,你现在可以随意分享和使用你的应用程序。

现在你已经了解了 go build 的基础知识,你可以探索如何使用自定义构建标签定制 Go 二进制文件的模块化源代码,或者如何为不同平台构建不同操作系统和架构的应用程序。如果你想更多地了解 Go 编程语言,可以查看整个《如何在 Go 中编码》系列文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞_23种设计模式_访问者模式

文章目录 1 访问者模式(Visitor Pattern)1.1 介绍1.2 概述1.3 访问者模式的结构1.4 访问者模式的优缺点1.5 访问者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 拓展——双分派4.1 分派4.2 动态分派(多态&am…

4.网络编程-websocket(golang)

目录 什么是websocket golang中使用websocket Server端 Client端 什么是websocket WebSocket是一种在互联网上提供全双工通信的协议,即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的,旨在解决传统HTTP协议在实…

uniapp使用vuex

1、uniapp中使用vuex_uniapp使用vuex-CSDN博客 2、uniapp中使用vuex(store)模块的例子 - 简书 (jianshu.com) 3、vuex介绍及使用指南(面向实战)_vuex 实战应用-CSDN博客

工程中实践的微服务设计模式

大家好,我是 方圆。最近在读《微服务架构设计模式》,开始的时候我非常的好奇,因为在我印象中,设计模式是常说的那23种设计模式,而微服务的设计模式又是什么呢?这个问题也留给大家,在文末我会附上…

opencv图像处理技术(阈值处理与图像平滑)

进行图像处理时,常常需要对图像进行预处理以提取所需的信息或改善图像质量。阈值处理和图像平滑是两种常见的预处理技术。 阈值处理 阈值处理是一种图像分割技术,其基本思想是将图像中的像素值与一个或多个预先设定的阈值进行比较,根据比较…

PCL 线段到三角形的距离(3D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里沿用之前直线到三角形的距离计算思路: 1、首先,我们可以判断直线与三角形是否相交,相交则距离为0,这里可以参考之前的博客:PCL 计算一条射线与一个三角形的交点。 2、如果直线与三角形未相交,则只需要判断…

【人工智能】猫狗识别

猫狗识别 实验背景 数据集介绍 我们使用CIFAR10数据集。CIFAR10数据集包含60,000张32x32的彩色图片,10个类别,每个类包含6,000张。其中50,000张图片作为训练集,10000张作为验证集。这次我们只对其中的猫和狗两类进行预测。 图 1 CIFAR10 数据…

Windows11配置VUE开发环境

目录 一、按照nodejs二、命令安装npm cache clean --forcenpm install -g vue/clinpm install npm -gnpm install webpacknpm install vue-cli -g与npm install -g vue/cli区别npm install -g cnpm --registryhttps://registry.npm.taobao.orgnpm i yarn -g --verbosenpm i -g …

网络与并发编程(一)

并发编程介绍_串行_并行_并发的区别 串行、并行与并发的区别 串行(serial):一个CPU上,按顺序完成多个任务并行(parallelism):指的是任务数小于等于cpu核数,即任务真的是一起执行的并发(concurrency):一个CPU采用时间…

IDEA 导出jar无法执行 错误: 找不到或无法加载主类

1、首先配置正确Project Struct 保证需要引用的jar包库添加到Libraries里,尽管添加到Modules里依然可以测试运行或调试,但导出的jar包会遇到问题。 2、导出jar,方式选择如下 选择”From modules with dependencies" 然后去掉以上“Extr…

手机如何在线制作gif?轻松一键在线操作

现在大家都喜欢使用手机来拍摄记录有趣的事物,但是时间长了手机里的视频越来越多导致手机存储空间不够了,这些视频又不想删除时应该怎么办呢?这个很简单,下面就给大家分享一款不用下载手机就能操作的视频转gif网站-GIF中文网&…

【贪玩巴斯】Mac的M芯片(M1/2...)下载homebrew方法(24年最新且已验证可行)

1. 按照目前广为流传的方法(M1会出现一些问题): 终端输入: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 使用国内镜像下载。 2. 输入后按照要求步骤执行即可&#xff…

k8s单节点部署,容器运行时使用containerd

环境 系统 : entOS Linux release 7.9.2009 (CoreIP:192.168.44.177 硬件要求:控制平面最少需要 2c2g 安装前环境准备 如果是集群部署还需要配置时间同步 关闭防火墙 systemctl disable firewalld关闭selinux setenforce 0sed -i s/SELI…

KADB锁冲突查看及解决

构造锁冲突 分布开启两个终端,一个终端执行: begin; update data_table set addrtest where id89; 另外一个终端执行: alter table data_table add test varchar(20); 观察锁冲突情况 test# select pid,waiting,waiting_reason,query from p…

sql注入-MySQL

01. 常用符号、函数、语句 1.1. 常用符号 1.1.1. 注释符 注释符说明#(%23)单行注释 在URL中#表示锚点,也就是hash路由,带上#不会请求后端路由,而是刷新前端路由,所以测试一般用URL编码后的%23– – - -+单行注释 注意–后还有一个空格;其中+号会被URL解码为空格/**/多行…

Python学习从0开始——009类

Python学习从0开始——009类 一、类3.1最简形式3.2Class 对象3.3实例对象3.4实例变量 二、继承2.1最简形式2.2多重继承 三、私有变量四、杂项 一、类 3.1最简形式 class ClassName:<statement-1>...<statement-N>3.2Class 对象 #包含三种属性引用 class MyClass…

前后端接口写法(传输数据)

目录 前言1. 零散数据2. 函数体3. 总结 前言 对于后端常用的两个注解&#xff1a;详细分析Java中的RequestParam和RequestBody 以下文章主要用于笔记总结&#xff0c;后续可翻看 1. 零散数据 前端数据 export const doWeekPlan (ids,selectedPeriod) > {return reques…

Vue - 你知道Vue组件中的data为什么是一个函数吗

难度级别:中高级及以上 提问概率:80% 在Vue项目中,App.vue下的每个子组件都会生成一个单独的Vue实例对象,但这些子对象都是通过通过vue.extend方法创建而来的,也就是说我们平时在项目中所定义的Vue组件,都有一个相同的父类对象。这样也就…

JS-PC/MOBILE技巧--PC

一、PC 端网页特效 1、元素偏移量 offset 系列 offset 概述 offset 就是偏移量&#xff0c;使用 offset 系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等。 获取元素距离带有定位父元素的位置获取元素自身的大小&#xff08;宽度高度&#xff0…

2024-04-07 问AI: 在深度学习中,预训练是什么?

文心一言 在深度学习中&#xff0c;预训练&#xff08;Pre-training&#xff09;是一种模型训练的技术&#xff0c;主要目的是利用大量无标签或已标签的数据来初始化模型的参数&#xff0c;从而为后续的任务提供一个好的起点。这种技术可以帮助模型学习到数据的通用表示&#…