导入的结构用作匿名字段

时间:2016-06-30 19:54:44

标签: go

所以我试图写一些Go文件,以便有一个面向公众的包和一个内部包。

在面向公众的包中,有一个与内部结构几乎相同(缺少一个字段)的结构。

我想在内部结构中使用匿名字段,但它似乎没有很好地发挥。

示例:

公共/ public.go:

package public

type PublicStruct struct {
    Field1 bool `json:"fetchStats"`
}

数据/ data.go

package data

import publicData "public"

type InternalStruct struct {
    publicData.PublicStruct
    Field2 bool `json:"includeHidden:`
}

滤波器/ filter.go:

package filter

import "data"

func test() {
    tmp := data.InternalStruct{Field1: true, Field2: false}
}

main.go:

package main

import "filter"
import "data"

func main() {
    var tmp data.InternalStruct
    tmp.Field1 = true
    tmp.Field2 = true
    filter.Test()
}

预期:没有问题

结果:filter/filter.go:6: unknown data.InternalStruct field 'Field1' in struct literal

为什么这不起作用,我该怎么做才能使它工作(我目前在两种结构方法中使用重复参数)?

PS:我不知道如何在游乐场测试这个,因为它涉及多个文件。

1 个答案:

答案 0 :(得分:3)

问题是field1不会被公共包导出,因为它的名称较低。如果它是Field1,那么您可以在内部包中访问它,例如MyInternalStructInstance.Field1

编辑 - 解决OP的更新;

您在主体中用于启动的语法是错误的。它应该是:

tmp := InternalStruct{PublicStruct: PublicStruct{Field1: true}, Field2: false}

它与包或导入与导出无关。它可以在操场上轻松测试,这里有一个完整的例子; https://play.golang.org/p/tbCqFeNStd