”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 构建技术:深入探讨 Go

构建技术:深入探讨 Go

发布于2024-11-08
浏览:394

Building Techniques: A Deep Dive into Go

Go 一直是我个人职业生涯中的重要语言。当我在 Soundcast 担任 CTO 时,我用它构建了一个可靠的音频广告服务器和 SSP。 Go 让网络和并行变得如此简单,感觉就像作弊一样。所有这些都具有非常好的性能,这对于我们必须完成的工作来说是完美的。

在第 1 部分中,我们揭示了软件构建阶段的基础知识。在这篇文章中,我们将借助一种在我心中占有特殊地位的语言来使这一点变得更加相关。事实上,虽然不同语言构建软件的基础原理是相似的,但每种语言生态系统都有自己独特的工具和实践。

话不多说,让我们来探讨这些,特别关注 Go。

Go 的构建方法

Go 由 Google 设计,采用独特的构建方法,强调简单性和速度。

命令

Go 附带了一个构建命令。此命令编译由导入路径命名的包及其依赖项,但不安装结果。它生成一个可执行文件。

例子:

go build main.go

Go 中的交叉编译

Go 编译器最有用的功能之一是能够非常轻松地执行交叉编译。您所要做的就是设置 GOOS 和 GOARCH 环境变量以针对所需的平台。

例子:

GOOS=windows GOARCH=amd64 go build main.go

这将为 amd64 架构下的 Windows 创建可执行文件。

Go 模块

Go mod 来得有点晚,因为它是在 Go 1.11 中引入的,但它是一个内置的依赖管理系统。在此之前,我们必须将所有 Go 项目放入机器上名为 {$GOPATH} 的专用目录中。虽然它有效,但 Go mod 现在为我们提供了更大的灵活性,这很棒!

用法非常简单,就像 Go 中的所有内容一样。

  • go mod init 初始化一个新模块。
  • go.mod 文件跟踪依赖项及其版本。

你可以通过使用构建标签来添加条件编译,但在我看来,最有趣的功能是 Go 自动缓存构建输出以加速后续构建(当然,如果需要,你可以清理缓存)。

高级 Go 构建技术

嵌入资源

如果您想将静态文件包含在二进制文件中,则可以使用 //go:embed 指令。

种族检测

Go 在并行性方面非常棒。借助其 goroutine 系统以及它们之间进行通信的通道,开发人员可以轻松地将软件的工作负载分配到不同的内核上。但也很容易把事情搞砸并制造“竞赛”。

当两个 goroutine 同时访问同一个变量并且至少其中一次访问是写入时,就会发生数据竞争。有关详细信息,请参阅 Go 内存模型。

Go编译器可以帮你找到它们!

使用竞争标志来检测竞争条件:

go build -race main.go

分析和优化

我喜欢 Go 的主要事情之一是它的性能。这种语言不需要太多努力就能给出可靠的结果。但如果您想更进一步,Go 生态系统还为您提供了一些非常出色的工具来衡量性能和优化代码。

我不会详细介绍,但如果您想深入了解该主题,我邀请您阅读这篇文章:https://www.practical-go-lessons.com/chap-34-benchmarks

自定义构建模式

有时,您不是在构建软件,而是在构建插件或库等。 Go 团队为您提供支持。在Go中,你可以定义buildmode来得到你想要的结果!

  • 构建共享库: go build -buildmode=c-shared
  • 构建插件: go build -buildmode=plugin
  • 在 https://pkg.go.dev/cmd/go#hdr-Build_modes 获取完整列表

正如您所看到的,Go 在其编译器和生态系统中提供了很多功能,以允许开发人员充分利用 Go 技术。

今天就是这样。我将在本周发布另一篇文章,展示 TypeScript 的构建技术,所以如果您想确保不要错过,请订阅或关注!

在那之前,祝您编码愉快!

版本声明 本文转载于:https://dev.to/gdsources/building-techniques-a-deep-dive-into-go-27ed?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-13
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-13
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-13
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-13
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-13
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-13
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-13
  • 使用 html css 和 javascript 的图像滑块 carosual https://www.instagram.com/webstreet_code/
    使用 html css 和 javascript 的图像滑块 carosual https://www.instagram.com/webstreet_code/
    ?带有缩略图和悬停效果的图像轮播? 嘿,开发社区! ? 在我的最新视频中,我构建了一个优雅的图像轮播,其缩略图突出显示具有平滑悬停效果的活动图像。这种交互式设计增强了用户参与度,并为您的 Web 项目增添了现代感。 主要特点: 响应式布局:轮播在所有屏幕尺寸上都能完美调整。 交互式缩略图:可点击的缩...
    编程 发布于2024-11-12
  • React 的核心:理解组件重新渲染
    React 的核心:理解组件重新渲染
    在学习编程语言时,我们经常深入研究语法并专注于快速构建某些东西,有时会忽略一个关键问题:这种语言实际上解决了什么问题,以及它在幕后如何工作?将我们的注意力转移到理解语言的核心目的和机制上,可以让学习速度更快、适应性更强,使我们能够轻松驾驭最复杂的项目。语法总是可以查找的——即使是最经验丰富的开发人员...
    编程 发布于2024-11-12
  • JavaScript 中的 Deferreds、Promise 和 Future 之间有什么区别?
    JavaScript 中的 Deferreds、Promise 和 Future 之间有什么区别?
    JavaScript 中 Deferreds、Promise 和 Future 的区别在 JavaScript 中,deferreds、promise 和 futures 通常用于处理异步操作。这些概念中的每一个都有其独特的一组特征:Deferreds在正式文档中从未明确定义,deferreds 通...
    编程 发布于2024-11-12
  • 为什么我的 Web 应用程序中的请求之间没有维护 Gorilla 会话变量?
    为什么我的 Web 应用程序中的请求之间没有维护 Gorilla 会话变量?
    使用 Gorilla 会话时未维护会话变量问题使用 Gorilla Sessions Web 工具包时,会话变量不会跨请求保留。当服务器启动并且用户访问 localhost:8100/ 时,他们将被定向到 login.html,因为会话值不存在。登录后,会话变量将被存储,并且用户将被重定向到 hom...
    编程 发布于2024-11-12
  • 如何在Python中像“column -t”命令一样显示列化数据?
    如何在Python中像“column -t”命令一样显示列化数据?
    在 Python 中显示列式数据在命令行管理工具领域,通常需要以良好对齐的方式呈现数据列。虽然制表符提供了一种简单的解决方案,但在处理不同长度的数据时它们会失败。本文旨在通过提出受 Linux“column -t”命令行为启发的 Python 解决方案来应对这一挑战。Python 提供了一个强大的解...
    编程 发布于2024-11-12
  • 在 NumPy 数组中查找特定行的有效方法:问题和解决方案
    在 NumPy 数组中查找特定行的有效方法:问题和解决方案
    高效查找 NumPy 数组中特定行的实例使用 NumPy 数组时,可能会遇到需要确定是否array 包含特定行,但 ndarray 的标准 contains 方法引发了问题。本文针对此问题提出了高效且 Python 的解决方案。一种方法涉及使用 .tolist() 将 NumPy 数组转换为 Pyt...
    编程 发布于2024-11-12
  • 如何解决在服务器上使用 Matplotlib 的 Python 脚本的“_tkinter.TclError:无显示名称且无 $DISPLAY 环境变量”问题?
    如何解决在服务器上使用 Matplotlib 的 Python 脚本的“_tkinter.TclError:无显示名称且无 $DISPLAY 环境变量”问题?
    _tkinter.TclError:没有显示名称,也没有 $DISPLAY 环境变量问题使用 Matplotlib 的 Python 脚本在服务器上失败,并出现错误“生成绘图时没有显示名称和 $DISPLAY 环境变量”。出现此问题的原因是 Matplotlib 默认使用 Xwindows 后端,并...
    编程 发布于2024-11-12
  • 如何使用 Apache Commons IO 在 Java 中递归删除目录?
    如何使用 Apache Commons IO 在 Java 中递归删除目录?
    在 Java 中递归删除目录在 Java 中删除空目录非常简单。然而,当处理包含子目录和文件的目录时,该过程变得更加复杂。本文深入探讨了使用 Apache Commons IO 库递归删除整个目录的有效方法。Apache Commons IO 简介Apache Commons IO 提供了一套全面的...
    编程 发布于2024-11-12

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3