2017-01-31 48 views
1

structに同じ名前の2つの型を埋め込むにはどうしたらいいですか?たとえば:構造体に同じ名前の構造体を2つ埋め込む

type datastore { 
    *sql.Store 
    *file.Store 
} 

結果はduplicate field Storeになります。あなたは組み込みフィールドds.Storeを参照することができないので、これは理にかなっていますが、これはどうしたら実現できますか?

明確にするために、datastoreのインターフェイスを実装したいと考えています。そのためには、両方の構造体がインタフェースを作成するために互いに補完する必要があるため、両方の構造体が必要です。私はどのような代替手段を持っていますか?

+0

を、あなたはそれらの組み込みstrutctsの方法は、正確にお互いを補完する方法について少し詳しく説明していただけますか? – kostix

答えて

4

あなたは最初の明確な名前のタイプにあなたのwhatever.Storeをラップしようとすることができます:

import (
    "os" 
    "whatever/sql" 
) 

type SqlStore struct { 
    *sql.Store 
} 

type FileStore struct { 
    *os.File 
} 

type DataStore struct { 
    SqlStore 
    FileStore 
} 

Playground link

Go 1.9がタイプエイリアスをサポートする可能性があります(thisおよびthisを参照)。私はそれがあなたのケースで助けになるとは思っていませんが、学ぶのは興味深いかもしれません。

1

あなたは確かに二つの異なる部分構造に存在するが匿名フィールドとして含まれていても、フィールドを参照することができます。

package main 

import "fmt" 

type A struct { 
    x int32 
} 

type B struct { 
    x int32 
} 

type C struct { 
    A 
    B 
} 

func main() { 
    c := C{A{1}, B{2}} 
    //fmt.Println(c.x) // Error, ambiguous 
    fmt.Println(c.A.x) // Ok, 1 
    fmt.Println(c.B.x) // Ok, 2 
} 
関連する問題