2017-09-22 68 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