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