将结构的命名字段传递给其他函数

时间:2015-11-22 06:51:04

标签: go

这是我的第一个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) {
}

2 个答案:

答案 0 :(得分:3)

您应该考虑明确定义结构并重用它。使用支持静态类型的语言的全部意义在于尽可能定义类型,它有助于编译器查找错误并生成更快的代码。

另外,如果你想拥有一个更紧凑的代码,你可以使用anonymous fields的概念,虽然我不认为这是最好的方案。

答案 1 :(得分:1)

GLBList定义为struct of Array。在go中,没有什么叫做struct {}。所有go类型都实现了空接口,因此传递struct(在本例中为struct without name)可以使用空接口。有关详细信息http://blog.golang.org/json-and-go