一则关于Go的高级构建指北

news2024/11/26 20:24:48
本文将探索Golang高级构建技巧,从而有助于创建更高效的二进制文件。

构建选项

以下是 go build 命令最常用的一些选项:

  • -o: 指定输出文件名。默认输出文件名是主软件包的名称,在 Windows 系统中会自动添加 .exe 后缀。
  • -v: 详细输出。该选项会在编译时打印软件包的名称。
  • -work: 打印临时工作目录,退出时不删除。该选项对调试很有用。
  • -x: 打印指令。该选项可打印 go build 正在执行的指令。
  • -asmflags: 传递给 go tool asm 调用的参数。
  • -buildmode: 要使用的编译模式。默认构建模式为 exe。其他可能的值包括sharedpieplugin
  • -buildvcs: 是否在二进制文件中加入版本控制信息。默认值为auto(自动)。

有关 go build 命令的更多信息,可以运行以下命令:

go help build
包含哪些文件

在 Go 中使用 go build 命令时,会编译当前目录及其子目录中的 Go 源文件,以创建可执行的二进制文件。默认情况下只编译 .go 文件,而忽略目录中的其他文件类型。不过,值得注意的是,go build 命令的行为可能会受到构建标签和构建约束的影响。

go build 通常会忽略以下类型的文件:

1.扩展名不是 .go 的文件:

目录中任何没有 .go 扩展名的文件都将被忽略,包括文本文件、配置文件、图片等。

2.子目录中的文件:

go build 命令编译当前目录及其子目录中所有 .go 文件,其他文件和目录通常会被忽略。

3.以下划线或点号开头的文件:

go 工具会忽略以 . 或 _ 开头的目录和文件名,以及名为 testdata 的目录。

4.被构建约束排除的文件:

Go 支持构建约束,允许根据目标操作系统或体系架构等条件,构建过程中包含或排除特定文件。例如,在为非 Windows 平台构建时,带有 //go:build windows 等构建约束的文件将被忽略。

5.通过构建标签排除的文件:

构建标签是 Go 源文件中的特殊注释,可用于根据自定义条件指定哪些文件应包含在编译中。如果文件的构建标记与构建上下文不匹配,则会被忽略。

6."testdata"目录中的文件:

testdata 的目录中的文件将被忽略。该目录通常用于包含与测试相关的数据,而这些数据并不需要编译。

构建标签

Go 的构建标签提供了一种强大的机制,可在构建过程中包含或排除特定代码。通过使用构建标签,开发人员可以定制自己的应用程序,使其适用于不同的构建配置、环境或特定平台要求。这一功能在处理交叉编译或为特定操作系统创建二进制文件时尤为重要。

构建标签是放在 Go 源文件开头的注释,指定了一组条件,标识在这些条件下,该文件中的代码应被包含或排除在联编过程之外。语法是 //go:build 。例如,考虑这样一种情况:只有在为应用程序的某个版本构建时,才会包含一段特定的代码:

main.go

package mainimport "fmt"

var version string
func main() {
    fmt.Println(version)
}

pro.go

//go:build pro
package main
func init() {
    version = "pro"
}

free.go

//go:build free
package main
func init() {
    version = "free"
}

当使用 -tags=free 时,输出将是 free,因为 free.go 文件已包含在内。而使用 -tags=pro 时,输出将是 pro

构建标签语法

可以像使用编程中的其他条件语句一样组合约束条件,如 AND、OR、NOT。

NOT

//go:build !cgo

只有在未启用 CGO 的情况下,才会在构建过程中包含该文件。

AND

//go:build cgo && darwin

只有启用 CGO 并且 GOOS 设置为 darwin 的情况下,才会在构建过程中包含该文件。

OR

//go:build darwin || linux

组合使用

//go:build (linux || 386) && (darwin || !cgo)

注意:1.16 及更早版本的 Go 使用了不同的构建约束语法,前缀为 // +build。当遇到旧语法时,gofmt 命令将添加等效的 //go:build 约束。

构建约束

除了使用构建参数设置自定义构建标签,golang 也会根据环境变量和其他因素自动设置一些标签。以下是可用标记的列表:

  1. GOOS 和 GOARCH 环境变量

可以在源代码中设置限制条件,只有在使用了特定 GOOS 或 GOARCH 时才能运行文件,例如:

//go:build darwin,amd64
package utils
  1. GO 版本限制

可以根据构建整个模块时使用的 go 版本来约束是否包含文件。例如,要只在使用 go 版本为 1.12 及以上时构建文件,可以使用 //go:build go1.18。如果 go 的版本是 1.18 或 1.21(截至本文撰写时的最新版本),则会包含该文件。

技术扩展延伸

只关注自己的一亩三分地,也是很难跳出程序员这个圈子的。前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

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

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

相关文章

【AI系列】Python NLTK 库和停用词处理的应用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

力扣236---二叉树的最近公共祖先(DFS,Java)

题目描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个…

电脑数据守护者:揭秘自动备份的神奇力量

在数字化时代,数据已经成为我们生活和工作中不可或缺的一部分。然而,电脑故障、人为误操作、恶意软件攻击等风险时刻威胁着数据的安全。因此,自动备份的重要性愈发凸显。它能够在数据发生意外丢失或损坏时,迅速恢复原始数据&#…

java入门学习Day03

本篇文章主要有java中的变量、命名方法、数据类型。 一、java中的变量 数据类型 变量名 数据值;int money 50; public class varibledemo {public static void main(String[] args) {int money 50;//变量的输出System.out.println(money);money 6…

浅谈 kafka

引言 同事在公司内部分享了关于 kafka 技术一些相关的内容,所以有了这篇文章;部分图片选自网络摘抄; 1 Kafka概述 1.1 定义 Kafka传统定义:kafka是一个分布式的基于发布/订阅模式的消息队列。 Kafka最新定义:kafka…

ubuntu 安装 cloudcompare(两种方法)

方法一 :从 snap 安装 (推荐) 安装简单,基本上功能都有(读写保存las,pcd,标注等) 安装: sudo apt-get update sudo apt install snap sudo snap install cloudcompare…

【送书福利第六期】:《AI绘画教程:Midjourney使用方法与技巧从入门到精通》

文章目录 一、《AI绘画教程:Midjourney使用方法与技巧从入门到精通》二、内容介绍三、作者介绍🌤️粉丝福利 一、《AI绘画教程:Midjourney使用方法与技巧从入门到精通》 一本书读懂Midjourney绘画,让创意更简单,让设计…

二十四种设计模式与六大设计原则(一):【策略模式、代理模式、单例模式、多例模式、工厂方法模式、抽象工厂模式】的定义、举例说明、核心思想、适用场景和优缺点

目录 策略模式【Strategy Pattern】 定义 举例说明 核心思想 适用场景 优缺点 代理模式【Proxy Pattern】 定义 举例说明 核心思想 适用场景 优缺点 单例模式【Singleton Pattern】 定义 举例说明 核心思想 适用场景 优缺点 多例模式【Multition Pattern】…

视频素材库哪个软件好?这8个高清无版权的素材网推荐

小伙伴们在制作短视频的时候,是不是为找素材发愁呢?一个高质量的无水印视频对创作者的帮助太大了,而且还需要无版权可商用的,那究竟有没有这样的网站呢?今天我来告诉大家。 1,蛙学府(中国&…

电商系列之售后退货

> 插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家…

InternLM 全链路开源体系

书生 浦语全链路开发体系:从数据到最后的应用,都有相应开源工具,其中模型,和数据集都有很好的开源支持。 一. 书生 万卷 书生万卷开发数据集包括,1.0和CC,拥有较为丰富的高质量的数据集,可用于…

Spring依赖注入思想分析

Spring 依赖注入思想分析 文章目录 Spring 依赖注入思想分析一、前言二、控制反转(Inversion of Control)1. 代码依赖初始化问题2. 匿名内部类解决方案3. 创建接口实现类方案4. 问题深入5. 定义父类解决问题1方案6. 控制反转解决问题2方案 三、依赖注入&…

Swift:“逻辑运算子“与“比较运算符“

1. 逻辑非 ! 逻辑非运算符 ! 是用于对布尔值取反的。当操作数为 true 时,! 将返回 false,而当操作数为 false 时,! 将返回 true。 let isTrue true let isFalse !isTrue // isFalse 现在是 false 2. 逻辑与 && 逻辑与运算符 &a…

CPU 密集型 和 IO密集型 的区别,如何确定线程池大小?

CPU密集型任务 是指需要大量的CPU资源进行计算的任务 CPU密集型任务通常涉及到复杂的计算,如算法逻辑、数学计算等,其特点是CPU使用率高,多在这种类型的任务中,线程数量一般与CPU的核心数相匹配就足够了。 一个简单的估算方法是…

线性CCD

线性CCD 综述:本文讲述了线性CCD是什么、由什么组成、工作原理、芯片TSL401的引脚和时序、线性CCD的时序。 1. 定义 线性CCD,只能采集一行像素,分辨率为128,也即是线性CCD≈128个光电传感器。经过光照时,光电二极管…

微信小程序开发【从入门到精通】——页面事件

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

三个表的联合查询的场景分析-场景4:c表维护a和b表的id关联关系(一对多)

基础SQL演练,带详细分析,笔记和备忘。 目录 背景介绍 表数据 需求1:查询g表所有记录,以及关联的h的id 需求2:在需求1基础上,查出关联的h的其它字段(name) 需求3:在需…

ssm009毕业生就业信息统计系统+vue

毕业生就业信息统计系统 摘 要 随着移动应用技术的发展,越来越多的学生借助于移动手机、电脑完成生活中的事务,许多的行业也更加重视与互联网的结合,以提高快捷、高效、安全,可以帮助更多有需求的人。针对传统毕业生就业信息统计…

瑞吉外卖实战学习--6、通过try和catch进行异常处理

try和catch进行异常处理 效果图前言1、公共拦截器进行异常处理1.1、创建公共报错处理的方法1.2、@ControllerAdvice中设置要拦截的类1.3、@ExceptionHandler中写处理的异常类2、完善错误拦截器2.1、效果效果图 前言 当用户名重复数据库会报错,此时就需要捕获异常操作 1、公共…

【文末 附 gpt4.0升级秘笈】超越Sora极限,120秒超长AI视频模型诞生

120秒超长AI视频模型发布:开启视频生成新纪元 随着人工智能技术的迅猛发展,AI视频生成领域也取得了令人瞩目的突破。近日,一项名为“StreamingT2V”的120秒超长AI视频模型正式发布,标志着文生视频技术正式进入长视频时代。这一技…