如何在不同的操作系统和架构中构建Go应用程序

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

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

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

前期准备

要学习本文中的示例,您需要:

  • 通过如何安装Go并设置本地编程环境来设置Go工作空间

“GOOS”和“GOARCH”可用的平台

在展示如何控制构建过程以构建不同平台的二进制文件之前,让我们首先检查一下Go能够构建哪些类型的平台,以及Go如何使用环境变量GOOSGOARCH引用这些平台。

Go工具有一个命令,可以打印出Go可以构建的可能平台的列表。这个列表可能随着每个新的Go版本而变化,因此这里讨论的组合在另一个版本的Go上可能不相同。在撰写本教程时,当前的Go版本是1.13

要找到可能的平台列表,请运行以下命令:

go tool dist list

You will receive an output similar to the following:

Outputaix/ppc64        freebsd/amd64   linux/mipsle   openbsd/386
android/386      freebsd/arm     linux/ppc64    openbsd/amd64
android/amd64    illumos/amd64   linux/ppc64le  openbsd/arm
android/arm      js/wasm         linux/s390x    openbsd/arm64
android/arm64    linux/386       nacl/386       plan9/386
darwin/386       linux/amd64     nacl/amd64p32  plan9/amd64
darwin/amd64     linux/arm       nacl/arm       plan9/arm
darwin/arm       linux/arm64     netbsd/386     solaris/amd64
darwin/arm64     linux/mips      netbsd/amd64   windows/386
dragonfly/amd64  linux/mips64    netbsd/arm     windows/amd64
freebsd/386      linux/mips64le  netbsd/arm64   windows/arm

输出是一组以/分隔的键值对。组合的第一部分,在/之前,是操作系统。在Go中,这些操作系统是环境变量GOOS的可能值,发音为“goose”,它代表Go operating System。第二部分,在/之后,是架构。和之前一样,这些都是环境变量GOARCH的所有可能值。它的发音是“gore-ch”,代表Go架构

让我们以linux/386为例来剖析其中的一个组合,以了解它的含义和工作原理。键值对以GOOS开头,在这个例子中是linux,指的是[linux操作系统]。这里的GOARCH386,代表英特尔80386微处理器。

有很多平台都可以使用go build命令,但大多数情况下,你最终会使用linuxwindowsdarwin作为GOOS的值。这些涵盖了三大操作系统平台:Linux、Windows和macOS, macOS基于Darwin操作系统,因此被称为“Darwin”。然而,Go也可以覆盖不那么主流的平台,如代表谷歌原生客户端的nacl

当你运行go build这样的命令时,go使用当前平台的GOOSGOARCH来确定如何构建二进制文件。为了找出你的平台组合,你可以使用go env命令并传递GOOSGOARCH作为参数:

go env GOOS GOARCH

为了测试这个例子,我们在AMD64架构的机器上的macOS上运行这个命令,因此我们将收到以下输出:

Outputdarwin
amd64

这里的命令输出告诉我们,我们的系统有GOOS=darwinGOARCH=amd64

你现在知道了Go中的GOOSGOARCH是什么,以及它们可能的值。接下来,我们将编写一个程序,作为示例,说明如何使用这些环境变量和构建标记来为其他平台构建二进制文件。

使用filepath.Join()编写一个平台相关的程序

在开始为其他平台构建二进制文件之前,让我们构建一个示例程序。Go标准库中的path/filepath包中的Join函数就是一个很好的例子。这个函数接受多个字符串,并返回一个用正确的filepath分隔符连接起来的字符串。

这是一个很好的示例程序,因为程序的操作取决于它运行在哪种操作系统上。在Windows上,路径分隔符是反斜杠\,而基于unix的系统使用正斜杠/

让我们从构建一个使用filepath.Join()的应用程序开始,稍后,您将编写自己的Join()函数实现,该函数将代码定制为特定于平台的二进制文件。

首先,在你的src目录下创建一个以你的应用程序命名的文件夹:

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

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

相关文章

【PTA刷题】 顺序表(删除)(代码+详解)

文章目录 题目C代码详解 题目 已知一组数据,采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素 输入格式: 输入包含三行数据,第一行是表中元素个数,第二行是顺序表的各个元素…

OpenCV极坐标变换函数warpPolar的使用

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为1702字,预计阅读4分钟 前言 前阵子在做方案时,得了几张骨钉的图片,骨科耗材批号效期管理一直是比较麻烦的,贴RFID标签成本太高,所以一般考虑还是…

Crow:黑魔法 添加路由3 绑定lambda

Crow:黑魔法2 new_rule_tagged实现模板参数的绑定-CSDN博客 template<uint64_t N> typename black_magic::arguments<N>::type::template rebind<TaggedRule>& new_rule_tagged(const std::string& rule) {using RuleT = typename black_magic::arg…

07.Go 流程控制

流程控制是Go语言中必不可少的一部分&#xff0c;也是整个编程基础的重要一环。Go语言的流程控制语句和其他编程语言的流程控制语句有些不同&#xff0c;主要体现在Go语言没有do-while语句。Go语言常用的流程控制包括if语句、switch语句、for语句及goto语句等&#xff0c;switc…

涉密网络的IP查询防护策略

涉密网络的安全性对于维护国家、企业及个人的核心利益至关重要。在当今数字化时代&#xff0c;网络攻击日益猖獗&#xff0c;其中IP查询是攻击者获取目标信息的一种常见手段。本文将探讨涉密网络中防护IP查询的关键策略&#xff0c;以确保网络的机密性和安全性。 1. 专用VPN和…

一个文件下png,jpg,jpeg,bmp,xml,json,txt文件名称排序命名

#utf-8 #authors 会飞的渔WZH #time:2023-12-13 import os# 要修改的图像所在的文件夹路径 root_path rD:\images\lines2\3 # 要修改的图像所在的文件夹路径filelist os.listdir(root_path) #遍历文件夹 print(len(filelist)) i0for item in filelist:if item.endswith(.…

《点云进阶》专栏文章目录

目录 一、PCL进阶篇* 二、Open3D进阶篇 一、PCL进阶篇 * PCL 最小二乘拟合二维直线PCL 最小二乘拟合空间直线PCL 计算点云的倒角距离&#xff08;Chamfer Distance&#xff09;PCL 点云配准精度评价——点到面的均方根误差PCL 可视化八叉树PCL 计算Hausdorff距离PCL 从变换矩…

@EventListener工作原理

EventListener 是 Spring Framework 提供的用于处理事件监听的注解。它的工作原理基于观察者设计模式&#xff0c;其中有一个事件发布者&#xff08;publisher&#xff09;和一个或多个事件监听者&#xff08;listener&#xff09;。 事件发布者&#xff08;Event Publisher&am…

使用 Timm 库替换 RT-DETR 主干网络 | 1000+ 主干融合RT-DETR

文章目录 前言版本差异说明替换方法parse_moedl( ) 方法_predict_once( ) 方法修改 yaml ,加载主干论文引用timm 是一个包含最先进计算机视觉模型、层、工具、优化器、调度器、数据加载器、数据增强和训练/评估脚本的库。 该库内置了 700 多个预训练模型,并且设计灵活易用。…

winform使用CefSharp嵌入VUE网页并交互

1、NuGet添加CefSharp 如果下载慢或失败可以更新下载源 腾讯资源https://mirrors.cloud.tencent.com/nuget/华为资源https://repo.huaweicloud.com/repository/nuget/v3/index.json 2、将项目平台改为X64 3、在winform窗体添加cef using CefSharp; using CefSharp.WinForms; u…

微信小程序如何跳转到网页

微信小程序可以使用wx.navigateToMiniProgram方法实现跳转到其他小程序&#xff0c;但是跳转到网页需要使用wx.navigateTo方法&#xff0c;并将所跳转的地址写在URL参数中。 例如&#xff0c;跳转到百度的网页可以使用以下代码&#xff1a; wx.navigateTo({url: https://www.…

【QT】时间日期与定时器

目录 1.时间日期相关的类 2.日期时间数据与字符串之间的转换 2.1 时间、日期编辑器属性设置 2.2 日期时间数据的获取与转换为字符串 2.3 字符串转换为日期时间 3.QCaIendarWidget日历组件 3.1基本属性 3.2 公共函数 3.3 信号 4.实例程序演示时间日期与定时器的使用 …

Python将字符串拆成单字的函数代码设计

将字符串拆成单字的两种可能情况 要想将字符串拆成单字&#xff0c;在Python中有一个非常简单的方法&#xff0c;一行代码就可以搞定了。那就是将字符串转换成列表list即可。这个过程可以使用内置的list()函数。不过&#xff0c;如果是要将英文的拆分为单个单词&#xff0c;那…

04.HTML其他知识

HTML其他知识 1.HTML实体 介绍 在 HTML 中我们可以用一种特殊的形式的内容&#xff0c;来表示某个符号&#xff0c;这种特殊形式的内容&#xff0c;就是 HTML 实体。比如小于号 < 用于定义 HTML 标签的开始。如果我们希望浏览器正确地显示这些字符&#xff0c;我们必须在…

详解MySQL中一条SQL执行过程

MySQL基本架构 如下图所示&#xff0c;从宏观角度来说MySQL架构可以分为server层和存储引擎层&#xff0c;其中Server层包含如下: 连接器:进行身份认证和权限相关校验。查询缓存:MySQL8.0已废弃&#xff0c;查询缓存主要是用于提高查询效率而加的一层缓存。分析器:对SQL执行动…

别再错过!这些隐藏版小网站,让你大呼过瘾!

今天给大家分享一些摸鱼小网站&#xff0c;再忙也别忘记摸鱼呀~~~ 01、简约时钟 网址&#xff1a;https://dateclock.net/ github&#xff1a;https://github.com/jtheletter/dateclock 这个是github上的一个开源项目&#xff0c;大家可以看到它的全部代码。打开网站就能看到…

法语 Alt 代码表

法语的 Alt 代码表&#xff0c;请参考下图。 输入方法就是按住 Alt 键不松开&#xff0c;然后在小键盘上输入字符&#xff0c;松开 Al 键&#xff0c;计算机就能输出上面的字符了。 西班牙语 Alt 代码表 - 系统容器 - iSharkFly西班牙语 Alt 代码表&#xff0c;请参考下图。 输…

《大模型合规白皮书2023》:为了解大模型立法最新动态和立法趋势提供有价值的参考

本白皮书在我国人工智能法律监管框架下进一步梳理了大模型相关方的合规义务及要点&#xff0c;并展望未来大模型法律监管体系的发展趋势与特征&#xff0c;对政府、企业、社会共建大模型治理体系提出切实建议&#xff0c;从而为社会各界了解大模型立法最新动态和立法趋势提供有…

C++ Qt开发:Slider滑块条组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍Slider滑块条组件的常用方法及灵活运用。 当…

Docker容器:docker推送镜像至Harbor

目录 1、Harbor创建项目 2、进入test项目&#xff0c;查看推送命令 3、在docker服务器上准备一个镜像 4、修改docker客户端配置 5、重启docker服务 6、docker登录Harbor 7、docker镜像推送到Harbor 1、Harbor创建项目 2、进入test项目&#xff0c;查看推送命令 3、在dock…