Go 为什么在使用UnmarshalJSON()时接收器值为nil?

Go 为什么在使用UnmarshalJSON()时接收器值为nil?,go,unmarshalling,Go,Unmarshalling,我想解组一些JSON,其中一部分包含类型为Spaces的字段,定义为type Spaces map[rune]float32。为了实现这一点,我为所述类型实现了解组JSON([]字节)错误,首先轻松地解组为映射[string]float32,然后只接受密钥长度正好为1符文的那些密钥/值对 但是,当调用Spaces类型的UnmarshalJSON()时,接收方s为零。为什么? 输入FontLoadInfo结构{ FontMetrics 地图集[]*地图集加载信息 } 类型FontMetrics结构

我想解组一些JSON,其中一部分包含类型为
Spaces
的字段,定义为
type Spaces map[rune]float32
。为了实现这一点,我为所述类型实现了
解组JSON([]字节)错误
,首先轻松地解组为
映射[string]float32
,然后只接受密钥长度正好为1符文的那些密钥/值对

但是,当调用
Spaces
类型的
UnmarshalJSON()
时,接收方
s
为零。为什么?

输入FontLoadInfo结构{
FontMetrics
地图集[]*地图集加载信息
}
类型FontMetrics结构{
基核浮动32
KerningOffsets映射[string]float32
空间
LineBreakYDistance浮动32
}
类型AtlasLoadInfo struct{
TextureFilePath字符串
基线整数
基线以上高度
高度低于基线内
基线之间的距离int
MinBlankPixelint列
行[]字符串
}
类型空格映射[rune]float32
func(s空格)解组JSON(b[]字节)错误{
如果字符串(b)=“空”{
归零
}
var compliantMap[字符串]浮动32
err:=json.Unmarshal(b,&compliantMap)
如果错误!=零{
返回错误
}
对于k,v:=范围符合性映射{
如果utf8.运行计算安装(k)!=1{
返回fmt.Errorf(“键中无符文或多符文”)
}
r、 _u:=utf8.解码运行安装(k)
如果r==utf8.RuneError{
返回fmt.Errorf(“密钥中的编码无效”)
}
s[r]=v//s为零
}
归零
}
用于解组的函数:

func ReadFontLoadInfo(文件路径字符串)(*FontLoadInfo,错误){
数据,err:=ioutil.ReadFile(文件路径)
如果错误!=零{
返回nil,fmt.Errorf(“无法读取字体加载信息文件:%w”,错误)
}
var fontLoadInfo*fontLoadInfo
err=json.Unmarshal(数据和fontLoadInfo)
如果错误!=零{
返回nil,fmt.Errorf(“无法解组字体加载信息:%w”,错误)
}
返回fontLoadInfo,无
}
我正在尝试解组的JSON:

{
    "Atlases": [
        {
            "TextureFilePath": "default-font-1.png",
            "BaseLineY": 130,
            "HeightAboveBaseLine": 80,
            "HeightBelowBaseLine": 24,
            "DistanceBetweenBaseLines": 117,
            "MinBlankPixelColumns": 10,
            "Lines": [
                "abcdefghijklm", "nopqrstuvwxyz",
                "ABCDEFGHIJKLM", "NOPQRSTUVWXYZ",
                "0123456789=?´`'",
                "!\"§$%&/()[]{}<>|",
                "*~+-_.,:;\\@€#²³",
                "äöüÄÖÜß"
            ]
        }
    ],
    "BaseKerning": 0.05,
    "Spaces": {
        " ": 0.2
    },
    "LineBreakYDistance": 1.1,
    "KerningOffsets": {
    }
}
{
“地图集”:[
{
“TextureFilePath”:“default-font-1.png”,
“基线”:130,
“基线以上高度”:80,
“高度低于基线”:24,
“基线之间的距离”:117,
“MinBlankPixelColumns”:10,
“行”:[
“abcdefghijklm”,“nopqrstuvxyz”,
“ABCDEFGHIJKLM”,“nopqrstuvxyz”,
"0123456789=?´`'",
"!\"§$%&/()[]{}|",
"*~+-_.,:;\\@€#²³",
"äöüÄÖÜß"
]
}
],
“基线紧排”:0.05,
“空间”:{
" ": 0.2
},
“线路中断距离”:1.1,
“KerningOffset”:{
}
}

使用指针接收器并自己创建地图。“接收器s为零。为什么?“因为nil是映射的零值,而您还没有初始化映射。decode.go的这一点让我感到困惑:
要将JSON对象解组到映射中,解组首先建立一个要使用的映射。如果映射为nil,解组分配一个新映射。
这只适用于插入
JSON.unmarshal()的根值
。另外(与问题无关),fontLoadInfo是指向fontLoadInfo的指针,因此您将解组为指向指针的指针。不要这样做。使用
new(fontLoadInfo)
初始化fontLoadInfo,或者将类型更改为
fontLoadInfo
(非指针类型)@Peter有什么特别的原因吗?这似乎得到了
json
包的完美支持。使用指针接收器并自己创建映射。“接收器s为零。”。为什么?“因为nil是映射的零值,而您还没有初始化映射。decode.go的这一点让我感到困惑:
要将JSON对象解组到映射中,解组首先建立一个要使用的映射。如果映射为nil,解组分配一个新映射。
这只适用于插入
JSON.unmarshal()的根值
。另外(与问题无关),fontLoadInfo是指向fontLoadInfo的指针,因此您将解组为指向指针的指针。不要这样做。使用
new(fontLoadInfo)
初始化fontLoadInfo,或者将类型更改为
fontLoadInfo
(非指针类型)@Peter有什么特别的原因吗?这似乎得到了
json
包的完美支持。