2017-09-22 60 views
0

创建一个功能我有一个像这么一些结构:从重复范围

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 
    } 
    } 
} 

因为我是一个可怕的,可怕的去开发,我知道有一个更好的方法来做到这一点。代码目前不是很干,我从字面上把这个范围应用到每个新的子命令中,这看起来很糟糕,一般让我觉得很蠢。

我想我需要创建一个函数,并在里面做测距,然后决定返回值。我无法弄清楚它应该是什么,概念不在那里。任何帮助将不胜感激。

回答

0

这听起来像你想要做的事,如:

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") 
+0

这看起来正是我需要的。 这里有什么结构?如果我想重新学习它,我将如何再次搜索。有时候最难的事情就是Google要找的东西。 – jaxxstorm