Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 在围棋中更具活力_Go - Fatal编程技术网

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 {
(代码的其余部分相同。)

你应该对此感到满意。如果没有,请继续阅读

如果标识结构字段的数据是一个
字符串
,我们要么使用某种分支(如上面的
开关
),要么使用反射根据
字符串
值获取字段

注意:使用反射而不是
开关
,我们将冒设置字段的风险,否则我们将不希望设置字段。此外,反思会使它变得更慢,更难理解。如果字段数量不大,只需使用
开关

如果键值等于字段名,这将非常简单,但请确保传递一个指向的指针,否则它将无法设置


如果键值不等于字段名,我们可以创建一个从实际键值到目标字段名的映射,因此在索引此映射后,获得的目标字段也是相同的。此解决方案还为我们提供了某种保护:如果键值不在映射中,我们将不会更改任何字段。

您所要求的不会保存您的数据。你可以用,但我不推荐。完美的,很好的答案。我不仅有字符串类型,所以我还将研究反射