case
不确定入参是什么样的字符串时。
func main() {
bt := []byte{230, 163}
args := map[string]string{}
args["a"] = string(bt)
fmt.Println("len a", len(args["a"]))
//json
input, err := json.Marshal(args)
if err != nil {
return
}
var b map[string]string
err = json.Unmarshal(input, &b)
fmt.Println("len b", len(b["a"]))
}
output :
len a 2
len b 6
why
[]byte{230,163},转为string 之后超出了utf8编码边界
unmarshal 时候,超出utf8 和 utf16 的字符,会被转为unicode编码,所以长度会发生改变.
直接传 []byte 会被转为base64
入参规定了只能string, 所以下面定义struct接收算是扩展吧,我不能用。。。
solve
- 将value 转为 16进制或base64,服务端单独做一层解码
bt := []byte{230,136}
hexStr := hex.EncodeToString(bt)
args := map[string]string{}
args["a"] = hexStr
fmt.Printf("a %v\n",bt)
println("len a", len(bt))
input, err := json.Marshal(args)
if err != nil {
fmt.Println(err)
}
var decodeArgs map[string]string
err =json.Unmarshal(input, &decodeArgs)
if err != nil {
return
}
b, err := hex.DecodeString(decodeArgs["a"])
if err != nil {
return
}
fmt.Println("b", b)
fmt.Println("len b", len(b))
// output
a [230 136]
len a 2
b [230 136]
len b 2
- 服务端声明一个对应的接收struct
type tb struct {
Bytes []byte
}
func main() {
bt := []byte{230,136}
args := tb{Bytes: bt}
fmt.Printf("a %v\n",bt)
println("len a", len(bt))
input, err := json.Marshal(args)
if err != nil {
fmt.Println(err)
}
var decodeArgs tb
err =json.Unmarshal(input, &decodeArgs)
if err != nil {
return
}
if err != nil {
return
}
fmt.Println("b", decodeArgs.Bytes)
fmt.Println("len b", len(decodeArgs.Bytes))
}
// output
a [230 136]
len a 2
b [230 136]
len b 2