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

建構技術:深入探討 Go

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

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]刪除
最新教學 更多>
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-05-05
  • 如何在無序集合中為元組實現通用哈希功能?
    如何在無序集合中為元組實現通用哈希功能?
    在未訂購的集合中的元素要糾正此問題,一種方法是手動為特定元組類型定義哈希函數,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    程式設計 發佈於2025-05-05
  • 圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    在chrome 中刪除一個頻繁的問題時,在與Chrome and IE9中的圖像一起工作時,遇到了一個頻繁的問題。和“邊境:無;”在CSS中。要解決此問題,請考慮以下方法: Chrome具有忽略“ border:none; none;”的已知錯誤,風格。要解決此問題,請使用以下CSS ID塊創建帶...
    程式設計 發佈於2025-05-05
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-05-05
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在Silverlight應用程序中,嘗試使用LINQ建立LINQ連接以錯誤而實現的數據庫”,無法找到查詢模式的實現。”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例...
    程式設計 發佈於2025-05-05
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,以便更快地搜索這些前綴。 理解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-05-05
  • C++成員函數指針正確傳遞方法
    C++成員函數指針正確傳遞方法
    如何將成員函數置於c 的函數時,接受成員函數指針的函數時,必須同時提供對象的指針,並提供指針和指針到函數。需要具有一定簽名的功能指針。要通過成員函數,您需要同時提供對象指針(此)和成員函數指針。這可以通過修改Menubutton :: SetButton()(如下所示:[&& && && &&華)...
    程式設計 發佈於2025-05-05
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-05-05
  • Python不會對超範圍子串切片報錯的原因
    Python不會對超範圍子串切片報錯的原因
    在python中用索引切片範圍:二重性和空序列索引單個元素不同,該元素會引起錯誤,切片在序列的邊界之外沒有。 這種行為源於索引和切片之間的基本差異。索引一個序列,例如“示例” [3],返回一個項目。但是,切片序列(例如“示例” [3:4])返回項目的子序列。 索引不存在的元素時,例如“示例” [9...
    程式設計 發佈於2025-05-05
  • 在Oracle SQL中如何提取下劃線前的子字符串?
    在Oracle SQL中如何提取下劃線前的子字符串?
    [ 在oracle sql 解決方案: Explanation:SUBSTR function extracts a substring starting from the specified position (0) and continuing for a specified length.IN...
    程式設計 發佈於2025-05-05
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
    程式設計 發佈於2025-05-05
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於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
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-05-05

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

Copyright© 2022 湘ICP备2022001581号-3