Pointers 采空区罐';t使用零指针值对映射进行编码

Pointers 采空区罐';t使用零指针值对映射进行编码,pointers,go,gob,Pointers,Go,Gob,如果其中一个值为nil,则当我尝试对指向指针的映射进行编码时,Gob的Encode返回一个错误。这似乎与文件相矛盾(但我可能误解了其含义): 在片、数组以及映射中,所有元素,甚至零值元素,都会被传输,即使所有元素都为零 代码: 输出: panic: gob: encodeReflectValue: nil element 在这种情况下,gob失败的原因是否充分?似乎两个明显的选项中的任何一个都比失败更可取:1)不使用零值值对任何键进行编码,或2)即使值为零值也对所有键进行编码。在当前情况下,递

如果其中一个值为nil,则当我尝试对指向指针的映射进行编码时,Gob的Encode返回一个错误。这似乎与文件相矛盾(但我可能误解了其含义):

在片、数组以及映射中,所有元素,甚至零值元素,都会被传输,即使所有元素都为零

代码:

输出:

panic: gob: encodeReflectValue: nil element
在这种情况下,gob失败的原因是否充分?似乎两个明显的选项中的任何一个都比失败更可取:1)不使用零值值对任何键进行编码,或2)即使值为零值也对所有键进行编码。在当前情况下,递归扫描我的结构以查看是否存在任何nil映射值,并删除这些键(如果存在)是最佳做法吗?如果需要进行此检查,则似乎应该由编码/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
    }
}

gob
编码流没有指针的概念。如果对指针值(如
*int
)进行编码,则会发送指针值,即
int
类型的值。如果需要,此转换在解码器端被反转,例如,如果在要设置
*int
值的流中发现
int
值,则将设置指向解码
int
值的指针(类型为
*int

因此,如果指针值本身是
nil
,则
gob
包无法编码任何值来代替指针值,则
nil
指针不指向任何内容。取消对
nil
指针的引用会导致运行时死机

这也记录在

指针不会被传输,但它们指向的东西会被传输;也就是说,这些值被展平Nil指针是不允许的,因为它们没有值。


出错真的比忽略这些值更好吗?在当前情况下,递归扫描我的结构以查看是否存在任何nil映射值,并删除这些键(如果存在)是最佳做法吗?如果需要进行此检查,则似乎应由编码/gob包负责,而不是用户。@rampatowl首先不应在映射中存储
nil
指针。它很少有用,如果您想使用
gob
对其进行编码,则禁止使用此类值。
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
    }
}