golang重複字元壓縮,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 。

golang依次替換字元串中相同的值

不是的,分情況。

golang支持兩種類型的字元串字面量:解釋型字元串:雙引號括起來的字元串(「「),轉義字元(如\n\r等)會被替換掉。

非解釋型字元串:用反引號(鍵盤左上角上的)括起來的字元串,轉義字元不會被解釋且可跨行(原樣輸出)

解壓縮文件Golang的簡便方法問題,怎麼解決

golang生成的json是格式化後的,有沒有提供方法壓縮一下 那些空格換行也佔用不了多少空間, 要壓縮可以自己寫個正則, 把那些空格、換行去掉就行了。

基礎知識 – Golang 中的格式化輸入輸出

【格式化輸出】

// 格式化輸出:將 arg 列表中的 arg 轉換為字元串輸出

// 使用動詞 v 格式化 arg 列表,非字元串元素之間添加空格

Print(arg列表)

// 使用動詞 v 格式化 arg 列表,所有元素之間添加空格,結尾添加換行符

Println(arg列表)

// 使用格式字元串格式化 arg 列表

Printf(格式字元串, arg列表)

// Print 類函數會返回已處理的 arg 數量和遇到的錯誤信息。

【格式字元串】

格式字元串由普通字元和佔位符組成,例如:

“abc%+ #8.3[3]vdef”

其中 abc 和 def 是普通字元,其它部分是佔位符,佔位符以 % 開頭(註:%% 將被轉義為一個普通的 % 符號,這個不算開頭),以動詞結尾,格式如下:

%[旗標][寬度][.精度][arg索引]動詞

方括弧中的內容可以省略。

【旗標】

旗標有以下幾種:

空格:對於數值類型的正數,保留一個空白的符號位(其它用法在動詞部分說明)。

0 :用 0 進行寬度填充而不用空格,對於數值類型,符號將被移到所有 0 的前面。

其中 “0” 和 “-” 不能同時使用,優先使用 “-” 而忽略 “0”。

【寬度和精度】

「寬度」和「精度」都可以寫成以下三種形式:

數值 | * | arg索引*

其中「數值」表示使用指定的數值作為寬度值或精度值,「 」表示使用當前正在處理的 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉到下一個。「arg索引 」表示使用指定 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉到指定 arg 的下一個。

寬度值:用於設置最小寬度。

精度值:對於浮點型,用於控制小數位數,對於字元串或位元組數組,用於控制字元數量(不是位元組數量)。

對於浮點型而言,動詞 g/G 的精度值比較特殊,在適當的情況下,g/G 會設置總有效數字,而不是小數位數。

【arg 索引】

「arg索引」由中括弧和 arg 序號組成(就像上面示例中的 [3]),用於指定當前要處理的 arg 的序號,序號從 1 開始:

‘[‘ + arg序號 + ‘]’

【動詞】

「動詞」不能省略,不同的數據類型支持的動詞不一樣。

[通用動詞]

v:默認格式,不同類型的默認格式如下:

布爾型:t

整 型:d

浮點型:g

複數型:g

字元串:s

通 道:p

指 針:p

無符號整型:x

T:輸出 arg 的類型而不是值(使用 Go 語法格式)。

[布爾型]

t:輸出 true 或 false 字元串。

[整型]

b/o/d:輸出 2/8/10 進位格式

x/X :輸出 16 進位格式(小寫/大寫)

c :輸出數值所表示的 Unicode 字元

q :輸出數值所表示的 Unicode 字元(帶單引號)。對於無法顯示的字元,將輸出其轉義字元。

U :輸出 Unicode 碼點(例如 U+1234,等同於字元串 “U+%04X” 的顯示結果)

對於 o/x/X:

如果使用 “#” 旗標,則會添加前導 0 或 0x。

對於 U:

如果使用 “#” 旗標,則會在 Unicode 碼點後面添加相應的 ‘字元’(前提是該字元必須可顯示)

[浮點型和複數型]

b :科學計數法(以 2 為底)

e/E:科學計數法(以 10 為底,小寫 e/大寫 E)

f/F:普通小數格式(兩者無區別)

g/G:大指數(指數 = 6)使用 %e/%E,其它情況使用 %f/%F

[字元串或位元組切片]

s :普通字元串

q :雙引號引起來的 Go 語法字元串

x/X:十六進位編碼(小寫/大寫,以位元組為元素進行編碼,而不是字元)

對於 q:

如果使用了 “+” 旗標,則將所有非 ASCII 字元都進行轉義處理。

如果使用了 “#” 旗標,則輸出反引號引起來的字元串(前提是

字元串中不包含任何製表符以外的控制字元,否則忽略 # 旗標)

對於 x/X:

如果使用了 ” ” 旗標,則在每個元素之間添加空格。

如果使用了 “#” 旗標,則在十六進位格式之前添加 0x 前綴。

[指針類型]

p :帶 0x 前綴的十六進位地址值。

[符合類型]

複合類型將使用不同的格式輸出,格式如下:

結 構 體:{欄位1 欄位2 …}

數組或切片:[元素0 元素1 …]

映 射:map[鍵1:值1 鍵2:值2 …]

指向符合元素的指針:{}, [], map[]

複合類型本身沒有動詞,動詞將應用到複合類型的元素上。

結構體可以使用 “+v” 同時輸出欄位名。

【注意】

1、如果 arg 是一個反射值,則該 arg 將被它所持有的具體值所取代。

2、如果 arg 實現了 Formatter 介面,將調用它的 Format 方法完成格式化。

3、如果 v 動詞使用了 # 旗標(%#v),並且 arg 實現了 GoStringer 介面,將調用它的 GoString 方法完成格式化。

如果格式化操作指定了字元串相關的動詞(比如 %s、%q、%v、%x、%X),接下來的兩條規則將適用:

4。如果 arg 實現了 error 介面,將調用它的 Error 方法完成格式化。

5。如果 arg 實現了 string 介面,將調用它的 String 方法完成格式化。

在實現格式化相關介面的時候,要避免無限遞歸的情況,比如:

type X string

func (x X) String() string {

return Sprintf(“%s”, x)

}

在格式化之前,要先轉換數據類型,這樣就可以避免無限遞歸:

func (x X) String() string {

return Sprintf(“%s”, string(x))

}

無限遞歸也可能發生在自引用數據類型上面,比如一個切片的元素引用了切片自身。這種情況比較罕見,比如:

a := make([]interface{}, 1)

a[0] = a

fmt.Println(a)

【格式化輸入】

// 格式化輸入:從輸入端讀取字元串(以空白分隔的值的序列),

// 並解析為具體的值存入相應的 arg 中,arg 必須是變數地址。

// 字元串中的連續空白視為單個空白,換行符根據不同情況處理。

// \r\n 被當做 \n 處理。

// 以動詞 v 解析字元串,換行視為空白

Scan(arg列表)

// 以動詞 v 解析字元串,換行結束解析

Scanln(arg列表)

// 根據格式字元串中指定的格式解析字元串

// 格式字元串中的換行符必須和輸入端的換行符相匹配。

Scanf(格式字元串, arg列表)

// Scan 類函數會返回已處理的 arg 數量和遇到的錯誤信息。

【格式字元串】

格式字元串類似於 Printf 中的格式字元串,但下面的動詞和旗標例外:

p :無效

T :無效

e/E/f/F/g/G:功能相同,都是掃描浮點數或複數

s/v :對字元串而言,掃描一個被空白分隔的子串

對於整型 arg 而言,v 動詞可以掃描帶有前導 0 或 0x 的八進位或十六進位數值。

寬度被用來指定最大掃描寬度(不會跨越空格),精度不被支持。

如果 arg 實現了 Scanner 介面,將調用它的 Scan 方法掃描相應數據。只有基礎類型和實現了 Scanner 介面的類型可以使用 Scan 類方法進行掃描。

【注意】

連續調用 FScan 可能會丟失數據,因為 FScan 中使用了 UnreadRune 對讀取的數據進行撤銷,而參數 io.Reader 只有 Read 方法,不支持撤銷。比如:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-18 19:59
下一篇 2024-11-18 19:59

相關推薦

  • 英語年齡用連字元號(Hyphenation for English Age)

    英語年齡通常使用連字元號表示,比如 “five-year-old boy”。本文將從多個方面探討英語年齡的連字元使用問題。 一、英語年齡的表達方式 英語中表…

    編程 2025-04-29
  • Python字元轉列表指南

    Python是一個極為流行的腳本語言,在數據處理、數據分析、人工智慧等領域廣泛應用。在很多場景下需要將字元串轉換為列表,以便於操作和處理,本篇文章將從多個方面對Python字元轉列…

    編程 2025-04-29
  • Python學習筆記:去除字元串最後一個字元的方法

    本文將從多個方面詳細闡述如何通過Python去除字元串最後一個字元,包括使用切片、pop()、刪除、替換等方法來實現。 一、字元串切片 在Python中,可以通過字元串切片的方式來…

    編程 2025-04-29
  • 使用Golang調用Python

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

    編程 2025-04-29
  • Python計算中文字元個數

    本文將從多個方面對Python計算中文字元個數進行詳細的闡述,包括字元串長度計算、正則表達式統計和模塊使用方法等內容。 一、字元串長度計算 在Python中,計算字元串長度是非常容…

    編程 2025-04-29
  • Python中如何判斷字元為數字

    判斷字元是否為數字是Python編程中常見的需求,本文將從多個方面詳細闡述如何使用Python進行字元判斷。 一、isdigit()函數判斷字元是否為數字 Python中可以使用i…

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

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

    編程 2025-04-29
  • Python中逗號算字元嗎

    Python中逗號既可以作為分隔符,也可以作為一個表達式中的運算符。關於逗號作為分隔符是不會被算作字元的事情,這點大家都知道。本文主要就是闡述逗號作為運算符在表達式中是會被算作字元…

    編程 2025-04-28
  • 從16進位轉義到中文字元

    16進位轉義是為了在不同的字符集、不同的編碼下,能夠保證特殊字元被正確的識別和渲染。本文將從多個方面對16進位轉義做詳細的闡述,讓讀者對其有更深入的了解。 一、轉義實現 在Web開…

    編程 2025-04-28
  • python字元轉換成位元組的方法

    Python是一種很流行的編程語言,它支持多種數據類型的操作和轉換。在實際應用中,我們經常需要把字元轉換成位元組來進行網路傳輸或者文件讀取等操作。Python提供了很多方法可以完成這…

    編程 2025-04-28

發表回復

登錄後才能評論