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

我正在使用一个用 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 中是否有更优雅的解决方案?


青春有我
浏览 550回答 2
2回答

SMILET

value.(string)正在做类型断言而不是类型转换 它检查是否value是一个字符串并返回相同的值以及一个布尔标志。要将接口转换为字符串,您可以使用它来格式化它,Sprintf这将返回单个字符串值,strValue := fmt.Sprint("%v", value)安全性取决于您的应用程序。如果您以后可以解析数据并解释数字和数组的含义,那么您应该没问题。由于它看起来像是简单存储信息的元数据存储,因此格式化字符串应该没问题。

慕桂英3389331

fmt.Sprintf("%v",value)安全地将任何值格式化为字符串。一个更简单的调用是fmt.Sprint(value). 这两个调用都使用类型的默认格式,这可能是也可能不是您想要的格式。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go