当我尝试将映射编码为指针(如果其中一个值为零)时,Gob 的编码会返回错误。这似乎与文档相矛盾(但我可能误解了含义):
在切片和数组以及映射中,所有元素(甚至零值元素)都会被传输,即使所有元素均为零。
代码:
package main
import (
"bytes"
"encoding/gob"
)
type Dog struct {
Name string
}
func main() {
m0 := make(map[string]*Dog)
m0["apple"] = nil
// Encode m0 to bytes
var network bytes.Buffer
enc := gob.NewEncoder(&network)
err := enc.Encode(m0)
if err != nil {
panic(err) // Output: panic: gob: encodeReflectValue: nil element
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
panic: gob: encodeReflectValue: nil element
Run Code Online (Sandbox Code Playgroud)
在这种情况下,gob 失败有充分的理由吗?看来两个明显的选项中的任何一个都比失败更可取:1)不要使用零值的值对任何键进行编码,或者2)即使值是零值也对所有键进行编码。在目前的情况下,最佳实践是递归扫描我的结构以查看是否有任何 nil 映射值,如果有则删除这些键?如果需要进行此检查,则似乎应该由encoding/gob 包而不是用户负责。
此外,该规则不仅仅是“gob 无法对键值为 nil 的映射进行编码”,因为如果值类型是切片,则接受 nil:
func main() {
m0 := make(map[string][]string)
m0["apple"] = nil
// Encode m0 to bytes
var network bytes.Buffer
enc := gob.NewEncoder(&network)
err := enc.Encode(m0) // err is nil
if err != nil {
panic(err) // doesn't panic
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1935 次 |
最近记录: |