我有一些这样的结构:
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/