当前位置: 首页 > 面试题库 >

Gob无法使用nil指针值编码地图

禹智渊
2023-03-14
问题内容

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

在切片,数组和映射中,即使所有元素均为零,也会传输所有元素,即使是零值元素。

码:

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
    }
}

输出:

panic: gob: encodeReflectValue: nil element

在这种情况下,料滴是否有充分的理由失败?似乎两个明显的选择之一都比失败更可取:1)不对任何键值为零的键进行编码,或者2)即使值为零也对所有键进行编码。在当前状态下,最佳实践是递归地扫描我的结构以查看是否有任何nil映射值,如果有则删除这些键吗?如果需要进行此检查,则似乎应该由编码/
gob包而不是用户负责。

此外,规则不是简单地“ gob无法对键值为nil的映射进行编码”,因为如果值类型是slice,则可以接受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,则将发送指向的值,即type的值int。如果需要,可以在解码器端将此转换反向,例如,如果int*int要为其设置值的流中找到一个值,则将设置一个指针(类型为*int),指向已解码的int值。

因此,如果指针值本身是nil,则gob包没有可以编码的值而不是指针值,则nil指针将指向任何内容。取消引用nil指针是一种运行时恐慌。

在gob上也有记录:基础知识:

指针不被传输,但是指针所指向的事物被传输。即,将值展平。 不允许使用零指针,因为它们没有值。



 类似资料:
  • 问题内容: 如果我的结构包含类型为的指针,则用于检查该属性是否会导致,这使我感到奇怪。 具体来说,我将JSON对象编组到一个结构中,在该结构中,我想测试一个特定的属性是当相应的JSON结构不包含该属性时。如果不是要走的路,我应该怎么做? 问题答案: 您传递给的所有内容都包装在一个值中(如果还没有的话): 将比较值,其中第一个参数值 不是,仅包装在其中的值。 接口值表示为一对。您传递给的第一个值是一

  • 问题内容: 可以编译并运行: 这不会(产生标题中的错误): 有人可以帮我理解为什么吗?(学习围棋) 这些是这些方法: 问题答案: 该方法有一个 指针 接收器,因此要调用此方法,需要一个指向值的指针()。在第一个示例中,您将的返回值存储在类型为的变量中。 Go中的变量是可寻址的,并且在编写时,这是一个快捷方式,编译器将自动获取变量的地址,以具有必需的类型的接收者值以进行调用。因此,编译器会将其“转换

  • 我试图理解地址计算指令是如何工作的,尤其是使用< code>leaq命令。然后,当我看到使用< code>leaq进行算术计算的例子时,我会感到困惑。例如,下面的C代码, 在组装中, 如果我的理解是对的,leaq应该移动任何地址,应该是,评估为。我感到困惑的是,既然值x存储在中,这只是内存地址,为什么乘以%rdi 3然后左移这个内存地址2等于x乘以12?当我们乘以3时,我们不是跳转到另一个不保存值

  • 问题内容: 同时,通过去这个教程中去写FUSE文件系统,我遇到了这个神秘的分配: 有人可以解释这种语法的机制吗?它在声明它的上下文中如何适应?据我了解,赋值的结果实际上被忽略了(正确的表达式甚至会导致什么?nir Dir指针?) 问题答案: 这使编译器检查类型是否满足接口。 取得一个指针,使其成为一个指针,并将其分配给接口类型的未命名变量。由于我们从不使用此变量,因此必须将其命名。

  • 问题内容: 我是新手,尝试制作一个简单的网络爬虫。我不断收到“紧急情况:运行时错误:无效的内存地址或nil指针取消引用”,并且不知道如何解决该问题。我有一个“ advancedFetcher”功能和一个“basicFetcher”功能,在任何一个下都出现相同的错误。这个答案建议检查每个错误(我认为是错误),但仍然出现错误。谢谢! 编辑#1: 问题答案: 您的程序在惊慌之前打印错误吗?如果没有记错,

  • 问题内容: 将一些地图定义为: 我想要一个指向地图地址的变量(不要复制所有变量)。我尝试使用: 但在使用时,它显示 内部编译器错误:无类型的var,初始化:new 如何获得? 编辑 该错误由另一个问题显示。 问题答案: 映射是引用类型,因此它们总是通过引用传递。您不需要指针。转到文档