Go 导入的结构将用作匿名字段

Go 导入的结构将用作匿名字段,go,Go,所以我试着写一些Go文件,这样就有了一个面向公众的包和一个内部包 在面向公众的包中,有一个结构与内部结构几乎相同(缺少一个字段) 我曾想过在内部结构中使用匿名字段,但似乎效果不太好 例如: public/public.go: package public type PublicStruct struct { Field1 bool `json:"fetchStats"` } data/data.go package data import publicData "public"

所以我试着写一些Go文件,这样就有了一个面向公众的包和一个内部包

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

我曾想过在内部结构中使用匿名字段,但似乎效果不太好


例如:

public/public.go:

package public

type PublicStruct struct {
    Field1 bool `json:"fetchStats"`
}
data/data.go

package data

import publicData "public"

type InternalStruct struct {
    publicData.PublicStruct
    Field2 bool `json:"includeHidden:`
}
filter/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:未知数据。struct literal中的InternalStruct字段“Field1”


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



PS:我不知道如何在go Playerd中测试它,因为它涉及多个文件。

问题是,
field1
没有被公共包导出,因为它的名称是小写的。如果它是
Field1
,则可以在内部包中访问它,如
MyInternalStructInstance.Field1

编辑-地址OP的更新

在main中用于初始化的语法是错误的。应该是:

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

它与包或导入与导出无关。它可以很容易地在操场上测试,这里有一个完整的例子

不要使用
导入,这被认为是测试之外的错误做法。还要注意,
internal
是一个受限制的导入路径,并防止外部包导入它(这可能是您的情况下需要的),我得到了
导入
是一种糟糕的做法,但这是我所知道的让匿名结构尽可能紧密地工作的唯一方法。我以前使用过
import public
,匿名字段是
public.PublicStruct
,但这不起作用。我不确定您指的是什么,通过“.”导入不会更改结构嵌入的语义。它会更改引用,因此使用PublicStruct在内部与在公共中显示相同。我很确定这只是名称空间初始化,但我希望当导入一些内部内容并使用InternalStruct时,可以毫无问题地访问Field1。嵌入结构的名称是不相关的,选择器将解析Field1。我想你可能误解了嵌入的工作原理。请展示一个可复制的示例,带有预期结果,并且不使用“.”导入或保留的“内部”包。这是一个输入错误。Field1实际上应该大写。@EltonYang我更新了您当前面临的问题的解决方案。这是有道理的,但我希望有一种方法可以通过PublicStruct并能够引用Field1,就像它是InternalStruct的一部分一样,类似于继承对其他语言的作用。既然这是不可能的,我就认为你的答案是正确的。谢谢您的帮助。@EltonYang您在这里使用的语言功能称为嵌入,它的工作原理与访问类似,只是不用于初始化。在这种情况下,您必须是显式的,比如在声明嵌入类型的字段之前先声明它。在该语句之后,您可以执行
tmp.Field1
,并且不会出现任何错误,这与执行
tmp.PublicStruct.Field1
是一样的,但这确实是嵌入提供给您的唯一功能。它更等同于组合而不是继承,尽管它提供了两者的一些有用方面。