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

在go中将map的所有值转换为字符串

在go中将map的所有值转换为字符串

Go
青春有我 2022-06-01 17:36:31
我正在使用一个用 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 中是否有更优雅的解决方案?
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

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

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

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

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

由于它看起来像是简单存储信息的元数据存储,因此格式化字符串应该没问题。


查看完整回答
反对 回复 2022-06-01
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

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



查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 549 浏览
慕课专栏
更多

添加回答

举报

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