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

构建技术:深入探讨 Go

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

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]删除
最新教程 更多>
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,以便更快地搜索这些前缀。理解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-07-01
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-07-01
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-07-01
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-07-01
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-07-01
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-07-01
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-07-01
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解决此问题,必须确保提供给HAAR CASCADE XML文件的路径有效。在提供的代码片段中,级联分类器装有硬编码路径,这可能对您的系统不准确。相反,OPENCV提...
    编程 发布于2025-07-01
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-07-01
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-07-01
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-07-01
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-07-01
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-07-01
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-07-01
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-07-01

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

Copyright© 2022 湘ICP备2022001581号-3