我正在使用一个用 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)
安全性取决于您的应用程序。如果您以后可以解析数据并解释数字和数组的含义,那么您应该没问题。
由于它看起来像是简单存储信息的元数据存储,因此格式化字符串应该没问题。
慕桂英3389331
TA贡献2036条经验 获得超8个赞
fmt.Sprintf("%v",value)
安全地将任何值格式化为字符串。一个更简单的调用是fmt.Sprint(value)
. 这两个调用都使用类型的默认格式,这可能是也可能不是您想要的格式。
- 2 回答
- 0 关注
- 549 浏览
添加回答
举报
0/150
提交
取消