为了账号安全,请及时绑定邮箱和手机立即绑定

如何在charmap.All中迭代Charmaps列表并比较名称?

如何在charmap.All中迭代Charmaps列表并比较名称?

Go
杨__羊羊 2022-10-10 19:35:33
我想编写一个小命令行实用程序来解码/编码文本流,例如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 stringflag.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实际上是一个Encoding接口,我无法转换:charmap.Charmap(cmap).String()→cannot convert cmap (type encoding.Encoding) to type charmap.Charmap我对 Go 还是很陌生,并不完全理解类型和接口中的这些差异和等效性。
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

您可以将其分解如下,charmap.AllEncoding接口的一部分,可以使用range循环进行迭代。

相等是因为Charmap类型实现了接口,即每个charmap 类型将定义一个NewDecoder()和一个NewEncoder()方法实现。根据语言规范,如果结构实现了接口,它们可以进行比较(参见比较运算符

当类型 X 的值可比较且 X 实现 T 时,非接口类型 X 的值 x 和接口类型 T 的值 t 是可比较的。如果 t 的动态类型与 X 相同且 t 的动态值等于 x,则它们相等

通过上面的推论,我们可以理解func(*Charmap)StringCharmapstr

for _, enc := range charmap.All {

    cmap, ok := enc.(*charmap.Charmap)

    if ok && cmap.String() == encoder {

        // encode based on user's input

    }

}

uct类型上的方法,而不是接口上的方法。因此,正确的方法是键入断言您的接口值,然后调用相同的字符串函数。


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信