【发布时间】: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