」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 建構技術:深入探討 Go

建構技術:深入探討 Go

發佈於2024-11-08
瀏覽:939

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]刪除
最新教學 更多>
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-07-01
  • Python高效去除文本中HTML標籤方法
    Python高效去除文本中HTML標籤方法
    在Python中剝離HTML標籤,以獲取原始的文本表示 僅通過Python的MlStripper 來簡化剝離過程,Python Standard庫提供了一個專門的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    程式設計 發佈於2025-07-01
  • Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    在ASP.NET async void void async void void void void void void void的設計無需返回asynchroncon而無需返回任務對象。他們在執行過程中增加未償還操作的計數,並在完成後減少。在某些情況下,這種行為可能是有益的,例如未期望或明確...
    程式設計 發佈於2025-07-01
  • MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    在兩個條件下插入或更新或更新 solution:的答案在於mysql的插入中...在重複鍵更新語法上。如果不存在匹配行或更新現有行,則此功能強大的功能可以通過插入新行來進行有效的數據操作。如果違反了唯一的密鑰約束。 實現所需的行為,該表必須具有唯一的鍵定義(在這種情況下為'名稱'...
    程式設計 發佈於2025-07-01
  • PHP SimpleXML解析帶命名空間冒號的XML方法
    PHP SimpleXML解析帶命名空間冒號的XML方法
    在php 很少,請使用該限制很大,很少有很高。例如:這種技術可確保可以通過遍歷XML樹和使用兒童()方法()方法的XML樹和切換名稱空間來訪問名稱空間內的元素。
    程式設計 發佈於2025-07-01
  • 如何使用node-mysql在單個查詢中執行多個SQL語句?
    如何使用node-mysql在單個查詢中執行多個SQL語句?
    在node-mysql node-mysql文檔最初出於安全原因最初禁用多個語句支持,因為它可能導致SQL注入攻擊。要啟用此功能,您需要在創建連接時將倍增設置設置為true: var connection = mysql.createconnection({{multipleStatement:...
    程式設計 發佈於2025-07-01
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-07-01
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-07-01
  • 為什麼我會收到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_...
    程式設計 發佈於2025-07-01

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3