2016-06-30 7 views
-1

公開パッケージと内部パッケージがあるようなGoファイルをいくつか作成しようとしています。インポートされた構造体を匿名フィールドとして使用する

公開パッケージでは、内部構造体とほぼ同じ(1つのフィールドがない)構造体があります。

私は内部構造体に匿名フィールドを使用すると考えましたが、うまくいきません。


例:

パブリック/ 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


なぜこれが動作しないと私はそれを動作させるために何をすべき(I両方の構造体で重複パラメータを使用していますか?)


PS:これは複数のファイルが含まれているため、私はこのことを再生画面でどのようにテストするのか分かりません。

+2

'.'インポートは使用しないでください。テスト以外では悪い習慣とみなされます。また、 'internal'は制限されたインポートパスであり、外部パッケージがそれをインポートするのを防ぎます(これはあなたの意図であるかもしれません)。 – JimB

+0

私は' importを取得します。 '悪い習慣ですが、匿名の構造体をできるだけ密接に動作させるために私が知っている唯一の方法でした。 前に 'import public'を使っていましたが、匿名フィールドは' public.PublicStruct'でしたが、どちらもうまくいきませんでした。 –

+0

あなたが何を参照しているか分かりません。構造体埋め込みのセマンティクスは変更されません。 – JimB

答えて

3

field1は公開パッケージでエクスポートされていないという問題があります。名前が小文字であるためです。代わりにField1の場合は、

EDITのような内部パッケージ内でアクセスすることができます。

あなたのメインでinitilizationに使用している構文は間違っています。それは次のようになります。

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

それは、エクスポート対インポートされたパッケージやとは何の関係もありません。それは簡単に遊び場でテストすることができます。完全な例はここにあります。 https://play.golang.org/p/tbCqFeNStd

+0

それはタイプミスでした。 Field1は実際に大文字にする必要があります。 –

+0

@EltonYangあなたが現在直面している問題の解決策を更新しました。 – evanmcdonnal

+0

これは理にかなっていますが、PublicStructを通過し、他の言語の継承がどのように機能するかと同様に、Field1をInternalStructの一部として参照できる方法があることを期待していました。どのようにそれが可能でないかを見て、私はあなたの答えを正しいものとしてマークします。助けてくれてありがとう。 –

関連する問題