go - 如何在charmap.All中迭代Charmaps列表并比较名称?
问题描述
我想编写一个小命令行实用程序来解码/编码文本流,例如iconv
,但在 Go 中。用户将提供编码器和解码器名称,实用程序将检查它们charmap.All
以使用户参数在尝试解码/编码流之前有效。
我可以迭代charmap.All
并打印如下名称:
for _, cmap := range charmap.All {
fmt.Println(cmap)
}
我可以将我的cmap
var 与已知的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 ,这可能吗?
另外,我的cmap
var 和charmap.ISO8859_1
是如何等效的(在cmap == charmap.ISO8859_1
示例中),但cmap
实际上是一个Encoding接口,我无法转换:
charmap.Charmap(cmap).String()
→cannot convert cmap (type encoding.Encoding) to type charmap.Charmap
我对 Go 还是很陌生,并不完全理解类型和接口中的这些差异和等效性。
解决方案
您可以将其分解如下,charmap.All是Encoding接口的一部分,可以使用range
循环进行迭代。
相等是因为Charmap类型实现了接口,即每个charmap 类型将定义一个NewDecoder()
和一个NewEncoder()
方法实现。根据语言规范,如果结构实现了接口,它们可以进行比较(参见比较运算符)
当类型 X 的值可比较且 X 实现 T 时,非接口类型 X 的值 x 和接口类型 T 的值 t 是可比较的。如果 t 的动态类型与 X 相同且 t 的动态值等于 x,则它们相等
通过上面的推论,我们可以理解func(*Charmap)String是Charmap
struct类型上的方法,而不是接口上的方法。因此,正确的方法是键入断言您的接口值,然后调用相同的字符串函数。
for _, enc := range charmap.All {
cmap, ok := enc.(*charmap.Charmap)
if ok && cmap.String() == encoder {
// encode based on user's input
}
}
推荐阅读
- php - 通过 php7.1 后的参数太少。3 个参数通过,4 个参数预期。动态创建图像的脚本
- postgresql - 错误:运营商不存在:没有时区的时间> = bytea
- java - 我需要为 android 应用程序创建一个自定义搜索栏
- java - 如何从基于 Netty 的 Httpserver 向客户端发送多个响应
- c# - 如何使用 c# 在 microsoft botframework sdk v4 的本地文件夹中发送图像
- linux - QThread::start(优先级) vs Linux
- git - 在 git diff 前后获取文件
- c# - 谷歌地理编码器查找地址是否被地理编码到邮政编码级别或地址级别
- encoding - 为什么两个文件具有相同的文本和编码但大小不同?
- python - Python & pymysql:名称中带有连字符的数据库表