【发布时间】:2021-10-12 22:40:26
【问题描述】:
转到 gRPC 元数据,获取并转换值。
在我的日志中,我看到元数据正在被翻译成另一种类型(我认为是字节数组)
"latitude-bin":"\ufffd\u0019\u0014\ufffd\ufffdϑL","longitude-bin":"@Z\ufffd\ufffd\ufffd\u000e\ufffdD"
如果我没记错的话,这两个值都应该是 Double。
我想在 Golang 中将这些值转换为 Double 或 float64,但我对我的方法有点不确定,因为我不知道 latitude-bin 或 longitude-bin 的类型,我也不知道重现这些值(从我的客户的日志中获取)
这是我的方法
// GetLangitute get latitude from metadata `latitude-bin` and return nil when fails
func GetLangitute(ctx context.Context) *float64 {
metadataList := getMetaDataListByKey(ctx, latitudeBin)
if metadataList != nil {
s := metadataList[metadataIndex]
b := []byte(s)
// TODO:
// I'm still a bit unsure about this approach
data := math.Float64frombits(binary.BigEndian.Uint64(b))
return &data
}
return nil
}
func getMetaDataListByKey(ctx context.Context, key string) []string {
md, ok := metadata.FromIncomingContext(ctx)
if !ok {
return nil
}
metadataList := md.Get(key)
if isEmpty(metadataList) {
return nil
}
return metadataList
}
func isEmpty(metadataList []string) bool {
return len(metadataList) == 0
}
我尝试使用单元测试进行测试并且看起来不错,但我仍然不确定预期的结果,因为我无法重现它,这是我的单元测试
f := math.Float64frombits(uint64(6662343813755067509))
// ...
name: "Given key exist in metadata",
args: args{
ctx: metadata.NewIncomingContext(
context.Background(),
metadata.Pairs("latitude-bin", `\ufffd\u0019\u0014\ufffd\ufffdϑL`),
),
},
want: &f,
// ...
t.Run(tt.name, func(t *testing.T) {
got := GetLangitute(tt.args.ctx)
if tt.want != nil {
if *got != *tt.want {
t.Errorf("GetLangitute() = %v, want %v", got, tt.want)
}
} else {
assert.Nil(t, got)
}
})
【问题讨论】:
标签: arrays go binary byte grpc