键入结构的第二级切片

时间:2017-10-22 10:48:16

标签: go struct

我有这样的结构

type Item struct { 
    Data []struct {
        meta struct {
            ID int
        }
    }
}

func main () {
    _, value := range Item.Data {
        getId(value)
    }
}

func getId(v Item.Data) {
    return v.ID
}

getId()函数中,如何键入值为Item.Data struct的提示?或者正确地将Item.Data传递给getId

我创建了一个经过修改的简单示例。

1 个答案:

答案 0 :(得分:2)

快速笔记:

  • 无效Go
  • 小心公共与私人(首字母大写或小写)
  • go不是面向对象的
  • 循环以for
  • 开头
  • _, value := range Item.Data遍历一个类型,而不是一个不起作用的实例。
  • 您可能想要保存代码行,不要在Go中执行此操作。

嵌套结构定义是IMHO仅对一种关闭类型有用。例如,如果要将数据从JSON序列化为Go,则转换时可能需要一些临时结构。

如果您要定义要在整个程序中使用的类型,则应分别定义每个类型。这使得扩展和使用这些类型变得更加容易。

如果每个类型都是自己定义的,那么很容易在data类型上添加一个返回id字段的meta的方法。

为了使一切显而易见,我将事物命名为...Type...Field,您不需要这样做,这不是一个好习惯;)

func (d dataType) getId() int {
    return d.metaField.idField
}

完整示例:

package main

import (
    "fmt"
)

type dataType struct {
    metaField metaType
}

type metaType struct {
    idField int
}

type itemType struct {
    dataField []dataType
}

func (d dataType) getId() int {
    return d.metaField.idField
}

func main() {
    item := itemType{
        dataField: []dataType{
            dataType{
                metaField: metaType{
                    idField: 1,
                },
            },
        },
    }

    for _, value := range item.dataField {
        fmt.Println(value.getId())
    }
}