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

构建技术:深入探讨 Go

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

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]删除
最新教程 更多>
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-03-12
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-03-12
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-03-12
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-03-12
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-03-12
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-03-12
  • 我如何在C#/。网中合并两个图像,以保持透明度的同时以较大图像的形式居中?
    我如何在C#/。网中合并两个图像,以保持透明度的同时以较大图像的形式居中?
    在c#/。net中合并图像:综合指南 通过在各种域上组合多个域中的常见可视化的可吸引人的工作。在c#/。网络中,此合并过程涉及使用强大的图形API及其关联的类。假设您有两个图像:透明的500x500 image(imagea)和150x1150 image(Imageb)。您的目标是合并这些图像,...
    编程 发布于2025-03-12
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-03-12
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-03-12
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月份)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将...
    编程 发布于2025-03-12
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-03-12
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-03-12
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-03-12
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-03-12

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

Copyright© 2022 湘ICP备2022001581号-3