我正在使用一個用 go 編寫的應用程序,它獲取一個鍵列表并從數(shù)據(jù)中提取值(如果該鍵存在于數(shù)據(jù)中)。但是,此函數(shù)僅接受字符串值 - 不幸的是,我的數(shù)據(jù)同時具有數(shù)組和數(shù)字作為值(這無法更改,它來自 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 中是否有更優(yōu)雅的解決方案?
2 回答

SMILET
TA貢獻1796條經驗 獲得超4個贊
value.(string)
正在做類型斷言而不是類型轉換 它檢查是否value
是一個字符串并返回相同的值以及一個布爾標志。
要將接口轉換為字符串,您可以使用它來格式化它,Sprintf
這將返回單個字符串值,
strValue := fmt.Sprint("%v", value)
安全性取決于您的應用程序。如果您以后可以解析數(shù)據(jù)并解釋數(shù)字和數(shù)組的含義,那么您應該沒問題。
由于它看起來像是簡單存儲信息的元數(shù)據(jù)存儲,因此格式化字符串應該沒問題。

慕桂英3389331
TA貢獻2036條經驗 獲得超8個贊
fmt.Sprintf("%v",value)
安全地將任何值格式化為字符串。一個更簡單的調用是fmt.Sprint(value)
. 這兩個調用都使用類型的默認格式,這可能是也可能不是您想要的格式。
- 2 回答
- 0 關注
- 605 瀏覽
添加回答
舉報
0/150
提交
取消