arrays - 从重复范围创建函数

标签 arrays go struct

我有一些这样的结构:

type Datacenter struct {
  Name  string
  Key   string
  Hosts []Host
}

type Host struct {
  Name string
  Port int
}

填充这些结构后,它们看起来像这样:

[]config.Datacenter (len=2) {
  Datacenter {
    Name: "dc1",
    Key: "string",
    Hosts: []config.Host (len=1) {
      Host {
        Name: "dc1-server-1",
        Port: 8200 (int)
      }
    }
  },
  Datacenter {
    Name: "dc2",
    Key: "Another string",
    Hosts: []config.Host (len=2) {
      Host {
        Name: "dc2-server-1",
        Port: 8200 (int)
      },
      Host {
        Name: "dc2-server-2",
        Port: 8200 (int)
      }
    }
  }
}

我正在创建一个 CLI 工具,对于几乎每个命令,我都以这种方式遍历这些结构:

for _, d := range datacenters {
  if datacenter == d.Name || datacenter == "" {
    for _, h := range d.Hosts {
      // do something on each host in the range here
    }
  }
}

因为我是一个糟糕透顶的围棋开发者,所以我知道有更好的方法来做到这一点。目前代码不是很干,我实际上是在复制范围并将其粘贴到每个新的子命令中,这看起来很糟糕并且通常让我觉得自己很愚蠢。

我想我需要创建一个函数并在其中进行测距,然后再决定返回值。我只是不知道它应该是什么,概念不存在。任何帮助将不胜感激。

最佳答案

听起来你想做这样的事情:

func EachHost(datacenter string, f func(Host)) {
    for _, d := range datacenters {
        if datacenter == d.Name || datacenter == "" {
            for _, h := range d.Hosts {
                // do something on each host in the range here
                f(h)
            }
        }
     }
}

然后你可以这样做:

listHostNames := func(datacenter string) {
    EachHost(datacenter, func(h Host) {
        fmt.Println(h.Name)
    });
}
listHostNames("dc1")

关于arrays - 从重复范围创建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46374203/

相关文章:

c#按钮点击事件。从二维数组中提取坐标

java - 在方法中返回数组

JavaScript - 根据特殊顺序按属性对对象数组进行排序

google-app-engine - 预期的声明,找到 'IDENT' 项

c++ - 包含相同类型的结构指针的结构指针的初始化

javascript - D3.js JSON forEach 映射到新数组

go - 如何包装自定义 HandlerFunc

algorithm - 为什么我的红黑树实现基准测试显示线性时间复杂度?

c - 使用二叉搜索树查找数组中的最大整数,返回给出垃圾值

c - 分配值并将结构作为参数传递