golang指令,Golang語法

本文目錄一覽:

golang項目中使用條件編譯

golang中沒有類似C語言中條件編譯的寫法,比如在C代碼中可以使用如下語法做一些條件編譯,結合宏定義來使用可以實現諸如按需編譯release和debug版本代碼的需求

build tags 是通過代碼注釋的形式實現的,要寫在文件的最頂端;

go build指令在編譯項目的時候會檢查每一個文件的build tags,用來決定是編譯還是跳過該文件

build tags遵循以下規則

示例:

約束此文件只能在支持kqueue的BSD系統上編譯

一個文件可能包含多行條件編譯註釋,比如:

約束該文件在linux/386 或 darwin/386平台編譯

需要注意的點

正確的寫法如下:

編譯方法:

具有_$GOOS.go後綴的go文件在編譯的時候會根據當前平台來判斷是否將該文件導入並編譯;同樣適用於處理器架構判斷 _$GOARCH.go。

兩者可以結合起來使用,形式為: _$GOOS_$GOARCH.go

示例:

文件名必須提供,如果只由後綴的文件名會被編譯器忽略,比如:

這兩個文件會被編譯器忽略,因為以下劃線開頭的文件都會被忽略

Golang項目部署3,容器部署

容器部署即使用 docker 化部署 golang 應用程序,這是在雲服務時代最流行的部署方式,也是最推薦的部署方式。

跨平台交叉編譯是 golang 的特點之一,可以非常方便地編譯出我們需要的目標伺服器平台的版本,而且是靜態編譯,非常容易地解決了運行依賴問題。

使用以下指令可以靜態編譯 Linux 平台 amd64 架構的可執行文件:

生成的 main 便是我們靜態編譯的,可部署於 Linux amd64 上的可執行文件。

我們需要將該可執行文件 main 編譯生成 docker 鏡像,以便於分發及部署。 Golang 的運行環境推薦使用 alpine 基礎系統鏡像,編譯出的容器鏡像約為 20MB 左右。

一個參考的 Dockerfile 文件如下:

其中,我們的基礎鏡像使用了 loads/alpine:3.8 ,中國國內的用戶推薦使用該基礎鏡像,基礎鏡像的 Dockerfile 地址: ,倉庫地址:

隨後使用 ” docker build -t main . ” 指令編譯生成名為 main 的 docker 鏡像。

需要注意的是,在某些項目的架構設計中, 靜態文件 和 配置文件 可能不會隨著鏡像進行編譯發布,而是分開進行管理和發布。

例如,使用 MVVM 模式的項目中(例如使用 vue 框架),往往是前後端非常獨立的,因此在鏡像中往往並不會包含 public 目錄。而使用了 配置管理中心 (例如使用 consul / etcd / zookeeper )的項目中,也往往並不需要 config 目錄。

因此對於以上示例的 Dockerfile 的使用,僅作參考,根據實際情況請進行必要的調整。

使用以下指令可直接運行剛才編譯成的鏡像:

容器的分發可以使用 docker 官方的平台: ,國內也可以考慮使用阿里云: 。

在企業級生產環境中, docker 容器往往需要結合 kubernetes 或者 docker swarm 容器編排工具一起使用。

容器編排涉及到的內容比較多,感興趣的同學可以參考以下資料:

【GoLang】GO命令中go get拉取庫卡住、慢的解決方法

新手,像我在學習go的時候發現使用go get去拉取依賴庫的時候會很慢,有些甚至是根本拉取不到,網上有很多解決方案,設置代理,使用gopm。

gopm是類似於node.js的包管理工具,具體網上也有很多資料介紹;貼個鏈接:)

gopm介紹

但是gopm又要用go get去拉取,這不是 套娃 嗎;

所以,還是一了百了,設置代理就好了;

Windows用cmd、powershell,Linux or Mac用Terminal執行下列:

Windows:

Linux or Mac:

這樣你的go get就很快了;

我是個搞Java的Golang菜鳥,一起學習成長;

golang命令行庫Cobra的使用

寫了2次才寫完,內容很長,翻譯了很久,內容來源於Cobra github介紹。翻譯完也更全面的了解了Cobra,功能相當強大完善,各種使用的場景都考慮到了。另外也擴展了一些其它知識,比如 命令行玩法 , Levenshtein distance 等等。以下是正文:

Cobra提供簡單的介面來創建強大的現代化CLI介面,比如git與go工具。Cobra同時也是一個程序, 用於創建CLI程序

Cobra是建立在結構的命令、參數和標誌之上。

命令代表操作,參數和標誌是這些行動的修飾符。

最好的應用程序就像讀取句子。用戶會知道如何使用本機應用程序,因為他們將理解如何使用它。

比如下面的例子, server 是命令, port 是標誌:

在下面的命令,我們告訴Git克隆url地址bare

使用Cobra很簡單。首先,使用 go get 安裝最新版本

然後在你項目里引用Cobra

通常基於Cobra的應用程序將遵循下面的組織結構,當然你也可以遵循自己的介面:

在Cobra應用程序中,通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。

Cobra提供自己的程序來創建你的程序並且添加你想要的命令。這是最簡單的方式把Cobra添加到你的程序里。

這裡 你能找到相關信息

使用Cobra,需要創建一個空的main.go文件和一個rootCmd文件。你可以選擇在合適的地方添加額外的命令。

Cobra不需要特殊的構造函數。簡單的就可以創建你的命令。

理想情況下你把這個放在在 app/cmd/root.go

你會另外定義標誌和處理配置init()函數。

比如 cmd/root.go

你需要在main函數里執行root命令。

通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。

其它的命令通常定義在cmd/目錄下的自己文件內

如果你想創建一個version命令,你可以創建cmd/version.go文件,並在文件里這麼寫:

標誌提供修飾符控制動作命令如何操作

當標誌定義好了,我們需要定義一個變數來關聯標誌

‘持久’表示每個在那個命令下的命令都將能分配到這個標誌。對於全局標誌,’持久’的標誌綁定在root上。

Cobra默認只在目標命令上解析標誌,父命令忽略任何局部標誌。通過打開 Command.TraverseChildren Cobra將會在執行任意目標命令前解析標誌

你同樣可以通過 viper 綁定標誌:

在這個例子中,永久的標記 author 被 viper 綁定, 注意 , 當用戶沒有給 –author 提供值, author 不會被賦值。

標記默認是可選的,如果你希望當一個標記沒有設置時,命令行報錯,你可以標記它為必須的

驗證位置參數可以通過 Command 的 Args 欄位。

內置下列驗證方法

一個設置自定義驗證的例子

在下面的例子,我們定義了3個命令。2個在頂級,一個(cmdTimes)是其中一個頂級命令的子命令。在這個例子里,由於沒有給 rootCmd 提供 Run ,單獨的root是不能運行的,必須要有子命令。

我們僅為一個命令定義了標記。

更多關於flags的文檔可以在 找到

更完整大型程序的例子, 可以查看 Hugo .

當你的程序有子命令時,Cobra 會自動給你程序添加help命令。當你運行『app help』,會調用help命令。另外,help同樣支持其它輸入命令。例如,你有一個沒有任何其它配置的命令叫『create』,當你調用『app help create』 Corbra 將會起作用。

下面的輸入是 Cobra 自動生成的。除了命令和標誌的定義,其它不再需要。

help 就跟其它命令一樣,並沒有特殊的邏輯或行為。事實上,你也可以提供你自己help如果你想的話。

你能為默認的命令,提供你自己的help命令或模板。使用下面的方法:

後2個也將適用於任何子命令

當用戶提供無效的標記或命令,Cobra 將會返回 用法 。

你可能從上面的幫助意識到,默認的幫助將被嵌入到用法里然後作為輸出。

你能提供你自己的用法函數或模板給 Cobra 使用。

比如幫助,方法和模板都可以重寫。

如果Version欄位設置到了根命令,Cobra 會提供了一個頂層 『–version』標記。運行帶上『–version』標記的程序,將會按照模板版本信息。模板可以通過 cmd.SetVersionTemplate(s string) 方法修改

在命令運行前或運行後,再運行方法非常容易。 PersistentPreRun 和 PreRun 方法將會在 Run 之前執行。 PersistentPostRun 和 PostRun 方法將會在 Run 之後執行。 Persistent*Run 方法會被子命令繼承,如果它們自己沒有定義的話。這些方法將按照下面的屬性執行:

下面的例子,2個命令都使用了上面的特性。當子命令執行的時候,它將執行根命令的 PersistentPreRun ,但不會執行根命令的 PersistentPostRun :

輸出:

Cobra 會自動輸出建議,當遇到「unknown command」錯誤時。這使得當輸入錯誤時, Cobra 的行為類似 git 命令。例如:

建議會基於註冊的子命令自動生成。使用了 Levenshtein distance 的實現。每一個註冊的命令會匹配2個距離(忽略大小寫)來提供建議。

如果你希望在你的命令里,禁用建議或虛弱字元串的距離,使用:

你可以通過 SuggestFor 來給命令提供明確的名詞建議。這個特性允許當字元串不相近,但是意思與你的命令相近,別切你也不想給該命令設置別名。比如:

Cobra 可以基於子命令,標記,等生成文檔。以以下格式:

Cobra 可以生成一個bash-completion文件。如果你給命令添加更多信息,這些completions可以非常強大和靈活。更多介紹在 Bash Completions 。

原創文章,作者:GEXP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143289.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GEXP的頭像GEXP
上一篇 2024-10-14 18:47
下一篇 2024-10-14 18:47

相關推薦

  • 使用Golang調用Python

    在現代軟體開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • Python語法大全解析

    本文旨在全面闡述Python語法,並提供相關代碼示例,幫助讀者更好地理解Python語言。 一、基礎語法 1、Python的注釋方式 # 這是單行注釋 “”” 這是多行注釋,可以注…

    編程 2025-04-29
  • Python中複數的語法

    本文將從多個方面對Python中複數的語法進行詳細的闡述。Python中的複數是指具有實部和虛部的數,其中實部和虛部都是浮點數。它們可以用「實數+虛數j」的形式表示。例如,3 + …

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • parent.$.dialog是什麼技術的語法

    parent.$.dialog是一種基於jQuery插件的彈出式對話框技術,它提供了一個方便快捷的方式來創建各種類型和樣式的彈出式對話框。它是對於在網站開發中常見的彈窗、提示框等交…

    編程 2025-04-28
  • 編譯原理語法分析思維導圖

    本文將從以下幾個方面詳細闡述編譯原理語法分析思維導圖: 一、語法分析介紹 1.1 語法分析的定義 語法分析是編譯器中將輸入的字元流轉換成抽象語法樹的一個過程。該過程的目的是確保輸入…

    編程 2025-04-27
  • Python進階語法全面解析

    Python語言作為一種廣泛應用於人工智慧、數據分析、雲計算等多個領域的編程語言,擁有廣泛的社區和強大的生態系統。Python提供了基本語法以及常用函數和模塊,用於解決大量常規編程…

    編程 2025-04-27
  • LL(1)語法分析器:從語法規則到語法樹

    在編譯原理中,語法分析是編譯器的一個重要階段。語法分析器的作用是將代碼轉換成語法樹,以便後續階段進行處理。LL(1)語法分析器是語法分析器的一種,它採用的是自頂向下的分析方法,可以…

    編程 2025-04-25
  • C#條件編譯指令

    一、定義和作用 是C#中的條件編譯指令,用於根據條件的不同來編譯不同的代碼塊。在編譯程序時,編譯器會根據指定的條件來判斷該代碼塊是否需要被編譯。這個指令對於處理不同平台的代碼、處理…

    編程 2025-04-25
  • 詳細解析add指令

    一、add指令的含義 在計算機底層程序中, add指令是最常見的指令之一,它是用來執行加法運算的。加法運算是一種基本的數學運算,將兩個數相加後得到一個和,並將其存儲在指定的寄存器或…

    編程 2025-04-24

發表回復

登錄後才能評論