Go 在围棋中更具活力
我是新手,我非常喜欢静态类型检查,它已经在编译阶段为我节省了很多时间 但是我确实看到我复制了很多代码,比如Go 在围棋中更具活力,go,Go,我是新手,我非常喜欢静态类型检查,它已经在编译阶段为我节省了很多时间 但是我确实看到我复制了很多代码,比如 if string(key) == "altitude" { altitudeInt, _ := jsonparser.ParseInt(value) n.ThisDataRaw.Altitude = new(int) *n.ThisDataRaw.Altitude = int(altitudeInt) return nil } if string(key
if string(key) == "altitude" {
altitudeInt, _ := jsonparser.ParseInt(value)
n.ThisDataRaw.Altitude = new(int)
*n.ThisDataRaw.Altitude = int(altitudeInt)
return nil
}
if string(key) == "heading" {
headingInt, _ := jsonparser.ParseInt(value)
n.ThisDataRaw.Heading = new(int)
*n.ThisDataRaw.Heading = int(headingInt)
return nil
}
if string(key) == "speed" {
speedInt, _ := jsonparser.ParseInt(value)
n.ThisDataRaw.Speed = new(int)
*n.ThisDataRaw.Speed = int(speedInt)
return nil
}
有没有可能变得更加动态一点,这样我就不需要复制代码,对于下面的示例,就有一个单一的函数?如果没有任何“魔力”,您的代码可以简化为:
parsed, err := jsonparser.ParseInt(value)
// check err
switch intValue := int(parsed); key {
case "altitude":
n.ThisDataRaw.Altitude = &intValue
case "heading":
n.ThisDataRaw.Heading = &intValue
case "speed":
n.ThisDataRaw.Speed = &intValue
}
它更干净,并且包含最小的代码冗余。如果n.ThisDataRaw
字段是一个指针,我们可以执行更多操作:
parsed, err := jsonparser.ParseInt(value)
// check err
switch intValue, tdr := int(parsed), n.ThisDataRaw; key {
case "altitude":
tdr.Altitude = &intValue
case "heading":
tdr.Heading = &intValue
case "speed":
tdr.Speed = &intValue
}
如果n.ThisDataRaw
字段不是指针,我们仍然可以通过获取其地址来应用最后一步:
switch intValue, tdr := int(parsed), &n.ThisDataRaw; key {
(代码的其余部分相同。)
你应该对此感到满意。如果没有,请继续阅读
如果标识结构字段的数据是一个字符串
,我们要么使用某种分支(如上面的开关
),要么使用反射根据字符串
值获取字段
注意:使用反射而不是开关
,我们将冒设置字段的风险,否则我们将不希望设置字段。此外,反思会使它变得更慢,更难理解。如果字段数量不大,只需使用开关
如果键值等于字段名,这将非常简单,但请确保传递一个指向的指针,否则它将无法设置
如果键值不等于字段名,我们可以创建一个从实际键值到目标字段名的映射,因此在索引此映射后,获得的目标字段也是相同的。此解决方案还为我们提供了某种保护:如果键值不在映射中,我们将不会更改任何字段。您所要求的不会保存您的数据。你可以用,但我不推荐。完美的,很好的答案。我不仅有字符串类型,所以我还将研究反射