我需要解组一些数据,在一种情况下,编组的数据表示一个以字节数组为键的映射。
切片不允许作为映射键,但数组可以。但这里的问题是,据我所知,无法创建具有非常量大小的数组。
例子:
package main
import (
"fmt"
"reflect"
)
func getHashable(value interface{}) interface{} {
rfl := reflect.ValueOf(value)
if rfl.Kind() == reflect.Slice && rfl.Type().Elem().Kind() == reflect.Uint8 {
slice, ok := value.([]uint8)
if !ok {
panic(fmt.Errorf("Could not coerce to []uint8"))
}
var arr [len(slice)]uint8 // This fails
copy(arr, slice)
value = arr
}
return value
}
func unmarshalMap(serialized []byte) map[interface{}]interface{} {
result := make(map[interface{}]interface{})
for len(serialized) > 0 {
var value interface{}
key, bytesConsumed := deserializeValue(serialized)
serialized = serialized[bytesConsumed:]
value, bytesConsumed = deserializeValue(serialized)
serialized = serialized[bytesConsumed:]
result[getHashable(key)] = value
}
}
如果 deserializeValue() 返回 []byte,则它不能作为键存储在结果映射中。数组可以工作,但我无法创建数组,因为直到运行时我才知道需要什么大小,而且它只允许编译时间常量。
简化版https://play.golang.org/p/wkYGs3S-uSD失败并出现错误
./prog.go:15:12: non-constant array bound len(slice)
如何使用已解组的字节数组作为 Go 地图中的键?
交互式爱情
收到一只叮咚
相关分类