2 回答
TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
雖然使用 astring顯然是更好的方法,但如果您不控制的代碼使用字節(jié)數(shù)組作為鍵,那么您可以使用反射將字節(jié)切片轉(zhuǎn)換為數(shù)組作為接口。
varr := reflect.New(reflect.ArrayOf(len(slice), reflect.TypeOf(uint8(0))))
reflect.Copy(varr.Elem(), reflect.ValueOf(slice))
return varr.Elem().Interface()
在使用它之前請考慮其他選項(xiàng)。
游樂場: https: //play.golang.org/p/CXsxZwgjiRR
TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
使用string而不是固定大小的字節(jié)數(shù)組。一個(gè)字符串可以保存任意的字節(jié)序列。
func getHashable(value interface{}) interface{} {
rfl := reflect.ValueOf(value)
if rfl.Kind() == reflect.Slice && rfl.Type().Elem().Kind() == reflect.Uint8 {
value = string(rfl.Bytes())
}
return value
}
如果您只需要處理[]byte而不是命名類型[]byte,請使用類型斷言而不是反射:
func getHashable(value interface{}) interface{} {
switch value := value.(type) {
case []byte:
return string(value)
default:
return value
}
}
如果地圖的用戶需要區(qū)分字符串鍵和從 []byte 創(chuàng)建的鍵,請定義一個(gè)字符串類型來區(qū)分這些值:
type convertedSlice string
string()將上面代碼中的轉(zhuǎn)換使用替換為convertedSlice().
該應(yīng)用程序可以通過以下方式檢查轉(zhuǎn)換后的密鑰:
_, ok := key.(convertedSlice) // ok is true if key is converted slice.
并將密鑰轉(zhuǎn)換回 []byte :
cv, ok := key.(convertedSice)
if ok {
key = []byte(cv)
}
- 2 回答
- 0 關(guān)注
- 131 瀏覽
添加回答
舉報(bào)
