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

huangapple go评论115阅读模式
英文:

Passing structure's named fields to other functions

问题

这是我的第一个golang程序,而不仅仅是阅读文档,所以请容忍我。

我有一个结构体,如下所示:(来自解析的yaml)

  1. type GLBConfig struct {
  2. GLBList []struct {
  3. Failover string `json:"failover" yaml:"failover"`
  4. GLB string `json:"glb" yaml:"glb"`
  5. Pool []struct {
  6. Fqdn string `json:"fqdn" yaml:"fqdn"`
  7. PercentConsidered int `json:"percent_considered" yaml:"percent_considered"`
  8. } `json:"pool" yaml:"pool"`
  9. } `json:"glb_list" yaml:"glb_list"`
  10. }

现在,在我的主函数中,有一个循环,对每个GLB进行处理:

  1. for _, glb := range config_file.GLBList {
  2. processGLB(glb)
  3. }

processGLB函数的定义应该是什么样的,才能接收这种类型?

我尝试了以下代码,但它不起作用,我想知道为什么

  1. func processGLB(glb struct{}) {
  2. fmt.Println(glb)
  3. }
  4. ./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

然后,经过一些搜索,我发现以下代码可以工作。

  1. func processGLB(glb interface{}) {
  2. fmt.Println(glb)
  3. }

这样做是一个好主意吗?为什么我必须使用接口来传递一个简单的结构体字段?

最后,使用golang,有什么最优雅/正确的方法来做到这一点?

编辑:

简单的解决方法是单独定义结构体。

  1. type GLBList struct {
  2. Failover string `json:"failover" yaml:"failover"`
  3. GLB string `json:"glb" yaml:"glb"`
  4. Pool []struct {
  5. Fqdn string `json:"fqdn" yaml:"fqdn"`
  6. PercentConsidered int `json:"percent_considered" yaml:"percent_considered"`
  7. } `json:"pool" yaml:"pool"`
  8. }
  9. type GLBConfig struct {
  10. GLBs []GLBList `json:"glb_list" yaml:"glb_list"`
  11. }

然后,函数定义如下:

  1. func processGLB(glb GLBList) {
  2. // 处理逻辑
  3. }
英文:

This is my first golang program rather than just reading docs so please bear with me.

I've a structure like:- (comes from a parsed yaml)

  1. type GLBConfig struct {
  2. GLBList []struct {
  3. Failover string `json:"failover" yaml:"failover"`
  4. GLB string `json:"glb" yaml:"glb"`
  5. Pool []struct {
  6. Fqdn string `json:"fqdn" yaml:"fqdn"`
  7. PercentConsidered int `json:"percent_considered" yaml:"percent_considered"`
  8. } `json:"pool" yaml:"pool"`
  9. } `json:"glb_list" yaml:"glb_list"`
  10. }

Now, in my main function, there's a for loop which does processing of each GLB:-

  1. for _, glb := range config_file.GLBList {
  2. processGLB(glb)
  3. }

What will be the function definition of processGLB to receive this type?

I tried doing this but it doesn't work and I would like to know why.

  1. func processGLB(glb struct{}) {
  2. fmt.Println(glb)
  3. }
  4. ./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

Then, some googling later, this works.

  1. func processGLB(glb interface{}) {
  2. fmt.Println(glb)
  3. }

Is it a good idea to do this? Why do I have to use interfaces to pass a simple structure named field?

In the end, what's the most elegant/right way to do this in golang?

EDIT:

Simple solution was to define the structure separately.

  1. type GLBList struct {
  2. Failover string `json:"failover" yaml:"failover"`
  3. GLB string `json:"glb" yaml:"glb"`
  4. Pool []struct {
  5. Fqdn string `json:"fqdn" yaml:"fqdn"`
  6. PercentConsidered int `json:"percent_considered" yaml:"percent_considered"`
  7. } `json:"pool" yaml:"pool"`
  8. }
  9. type GLBConfig struct {
  10. GLBs []GLBList `json:"glb_list" yaml:"glb_list"`
  11. }

And then a function definition like:-

  1. func processGLB(glb GLBList) {
  2. }

答案1

得分: 3

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

此外,如果你想要更紧凑的代码,你可以使用匿名字段的概念,尽管我不认为这是最好的情况。

英文:

You should really consider define the struct explicitly and reuse it. The all point of using a langauge with support for static typing is to define your types whenever you can, it helps the compiler to find bugs and produce a faster code.

Also, if you would like to have a more compact code you can use the concept of anonymous fields, although I don't think that is the best scenario for this.

答案2

得分: 1

GLBList被定义为结构体的数组。在Go语言中,没有叫做struct{}的东西。所有的Go类型都实现了空接口,因此可以使用空接口来传递结构体(在这种情况下是没有名称的结构体)。更多详情请参考http://blog.golang.org/json-and-go。

英文:

GLBList is defined as Array of struct. In go, there is nothing called as struct{}. All the go type implements empty interface, hence to pass struct (in this case struct without name) empty interface can be used. For more details http://blog.golang.org/json-and-go

huangapple
  • 本文由 发表于 2015年11月22日 14:51:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/33852394.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定