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

构建技术:深入探讨 Go

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

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]删除
最新教程 更多>
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c 的函数时,接受成员函数指针的函数时,必须同时提供对象的指针,并提供指针和指针到函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此)和成员函数指针。这可以通过修改Menubutton :: SetButton()(如下所示:[&& && && &&华)...
    编程 发布于2025-05-05
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-05-05
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-05-05
  • 在Java中如何为PNG文件添加坐标轴和标签?
    在Java中如何为PNG文件添加坐标轴和标签?
    如何用java 在现有png映像中添加轴和标签的axes和labels如何注释png文件可能具有挑战性。与其尝试可能导致错误和不一致的修改,不如建议在图表创建过程中集成注释。使用JFReechArt import java.awt.color; 导入java.awt.eventqueue; 导入...
    编程 发布于2025-05-05
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-05-05
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示 仅通过Python的MlStripper 来简化剥离过程,Python Standard库提供了一个专门的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    编程 发布于2025-05-05
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-05-05
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-05-05
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-05-05
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的Python功能Eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。本文深入研究了eval()和ast.literal_eval()之间的差异,突出显示其安全性含义...
    编程 发布于2025-05-05
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withco...
    编程 发布于2025-05-05
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-05-05
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-05-05
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解决此问题,必须确保提供给HAAR CASCADE XML文件的路径有效。在提供的代码片段中,级联分类器装有硬编码路径,这可能对您的系统不准确。相反,OPENCV提...
    编程 发布于2025-05-05
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    class'ziparchive'在Linux Server上安装Archive_zip时找不到错误 commant in lin ins in cland ins in lin.11 on a lin.1 in a lin.11错误:致命错误:在... cass中找不到类z...
    编程 发布于2025-05-05

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

Copyright© 2022 湘ICP备2022001581号-3