【问题标题】:convert all values of map to string in go在go中将map的所有值转换为字符串
【发布时间】:2020-05-09 17:53:17
【问题描述】:

我正在使用一个用 go 编写的应用程序,它获取一个键列表并从数据中提取值(如果该键存在于数据中)。

然而,这个函数只接受字符串值 - 不幸的是我的数据有数组和数字作为值(这不能改变,它来自 Azure OIDC 登录)

所以与其抱怨,我想我会卷起袖子尝试自己修复它(之前从未写过一行“go”)

所以,这是原来的功能

func extractMetadata(logger log.Logger, allClaims map[string]interface{}, claimMappings map[string]string) (map[string]string, error) {
    metadata := make(map[string]string)
    for source, target := range claimMappings {
        if value := getClaim(logger, allClaims, source); value != nil {
            strValue, ok := value.(string)
            if !ok {
                return nil, fmt.Errorf("error converting claim '%s' to string", source)
            }

            metadata[target] = strValue
        }
    }
    return metadata, nil
}

我相信有问题的行是

strValue, ok := value.(string)

因为这就是我得到错误的地方。

如果我把它改成

strValue, ok := fmt.Sprintf("%v",value) (a) 工作并且 (b) 安全吗? ..

(fmt已经被代码导入了)

go 中有更优雅的解决方案吗?

【问题讨论】:

  • fmt.Sprintf("%v",value) 安全地将任何值格式化为字符串。一个更简单的电话是fmt.Sprint(value)。这两个调用都使用类型的默认格式,这可能是也可能不是您想要的格式。
  • 非常感谢您的评论-如果您想将其添加为答案,我会接受!再次感谢

标签: go


【解决方案1】:

value.(string) 正在执行类型断言而不是类型转换 它检查value 是否为字符串,并返回相同的值以及布尔标志。

要将接口转换为字符串,您可以使用Sprintf 对其进行格式化,这将返回单个字符串值,

strValue := fmt.Sprint("%v", value)

安全性取决于您的应用。如果您以后可以解析数据并解释数字和数组的含义,那应该没问题。

因为它看起来像是一个简单存储信息的元数据存储,所以格式化字符串应该没问题。

【讨论】:

    【解决方案2】:

    fmt.Sprintf("%v",value) 安全地将任何值格式化为字符串。一个更简单的电话是fmt.Sprint(value)。这两个调用都使用类型的默认格式,这可能是也可能不是您想要的格式。

    【讨论】:

      猜你喜欢
      • 2019-03-30
      • 1970-01-01
      • 2012-04-23
      • 2012-08-02
      • 2021-08-08
      • 2021-09-19
      • 2017-09-23
      • 2023-03-11
      • 2019-04-29
      相关资源
      最近更新 更多