我想撰寫一個小的命令列實用程式來解碼/編碼文本流,例如iconv, 但在 Go 中。用戶將提供編碼器和解碼器名稱,實用程式將charmap.All在嘗試解碼/編碼流之前檢查它們以使用戶引數有效。
我可以迭代charmap.All和列印名稱,如:
for _, cmap := range charmap.All {
fmt.Println(cmap)
}
我可以將我的cmapvar 與已知的Charmap進行比較:
if cmap == charmap.ISO8859_1 {
fmt.Println(charmap.ISO8859_1.String())
}
但我不知道下一步該怎么做,這似乎非常接近(而且很容易):
var encoder string
flag.StringVar(&encoder, "encoder", "ISO 8859-1", "name of encoder")
flag.Parse()
for _, cmap := range charmap.All {
if cmap.String() == encoder {
// encode based on user's input
}
}
考慮到編碼/字符映射API ,這可能嗎?
另外,我的cmapvar 和charmap.ISO8859_1如何等效(在cmap == charmap.ISO8859_1示例中),但cmap實際上是一個編碼介面,我無法轉換:
charmap.Charmap(cmap).String() → cannot convert cmap (type encoding.Encoding) to type charmap.Charmap
我對 Go 還是很陌生,并沒有完全理解這些型別和介面的差異和等價性。
uj5u.com熱心網友回復:
您可以將其分解如下,charmap.All是Encoding介面的一部分,可以使用range回圈進行迭代。
等式有效是因為Charmap型別實作了介面,即每個 charmap 型別都定義了一個NewDecoder()和一個NewEncoder()方法實作。根據語言規范,如果結構體實作了介面,則可以比較它們(參見比較運算子)
當型別 X 的值具有可比性且 X 實作 T 時,非介面型別 X 的值 x 和介面型別 T 的值 t 具有可比性。如果 t 的動態型別與 X 相同且 t 的動態值等于 x,則它們相等
通過上面的推論,我們可以理解func(*Charmap)String是Charmapstruct型別上的方法,而不是介面上的方法。因此,正確的方法是Type 斷言您的介面值,然后呼叫相同的字串函式。
for _, enc := range charmap.All {
cmap, ok := enc.(*charmap.Charmap)
if ok && cmap.String() == encoder {
// encode based on user's input
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/353828.html
上一篇:在Interface{}中存盤配置結構并將其轉換回原始結構
下一篇:在嵌套golang結構中使用指標
