这是我的第一个golang
计划,而不仅仅是阅读文档,所以请耐心等待。
我的结构如下: - (来自解析的yaml)
type GLBConfig struct {
GLBList []struct {
Failover string `json:"failover" yaml:"failover"`
GLB string `json:"glb" yaml:"glb"`
Pool []struct {
Fqdn string `json:"fqdn" yaml:"fqdn"`
PercentConsidered int `json:"percent_considered" yaml:"percent_considered"`
} `json:"pool" yaml:"pool"`
} `json:"glb_list" yaml:"glb_list"`
}
现在,在我的主要功能中,有一个for循环来处理每个GLB: -
for _, glb := range config_file.GLBList {
processGLB(glb)
}
processGLB
接收此类型的功能定义是什么?
我尝试过这样做,但它不起作用,我想知道原因。
func processGLB(glb struct{}) {
fmt.Println(glb)
}
./glb_workers.go:42: cannot use glb (type struct { Failover string "json:\"failover\" yaml:\"failover\""; Glb string "json:\"glb\" yaml:\"glb\""; Pool []struct { Fqdn string "json:\"fqdn\" yaml:\"fqdn\""; PercentConsidered int "json:\"percent_considered\" yaml:\"percent_considered\"" } "json:\"pool\" yaml:\"pool\"" }) as type struct {} in argument to processGLB
然后,谷歌搜索一下,这是有效的。
func processGLB(glb interface{}) {
fmt.Println(glb)
}
这样做是个好主意吗? 为什么我必须使用接口传递名为field的简单结构?
最后,golang中最优雅/正确的方法是什么?
修改
简单的解决方案是分别定义结构。
type GLBList struct {
Failover string `json:"failover" yaml:"failover"`
GLB string `json:"glb" yaml:"glb"`
Pool []struct {
Fqdn string `json:"fqdn" yaml:"fqdn"`
PercentConsidered int `json:"percent_considered" yaml:"percent_considered"`
} `json:"pool" yaml:"pool"`
}
type GLBConfig struct {
GLBs []GLBList `json:"glb_list" yaml:"glb_list"`
}
然后是一个函数定义,如: -
func processGLB(glb GLBList) {
}
答案 0 :(得分:3)
您应该考虑明确定义结构并重用它。使用支持静态类型的语言的全部意义在于尽可能定义类型,它有助于编译器查找错误并生成更快的代码。
另外,如果你想拥有一个更紧凑的代码,你可以使用anonymous fields的概念,虽然我不认为这是最好的方案。
答案 1 :(得分:1)
GLBList定义为struct of Array。在go中,没有什么叫做struct {}。所有go类型都实现了空接口,因此传递struct(在本例中为struct without name)可以使用空接口。有关详细信息http://blog.golang.org/json-and-go