2017-03-20 49 views
0

鑑於這樣的事情:如何轉換爲typeof(field)?

type Foo struct { 
    x int 
} 

type FooFoo struct { 
    foo *Foo 
} 

type Bar struct { 
    x int 
} 

Foo是隱藏的(在我的情況,由於vendoring),我怎麼可以創建一個有效的富條目FooFoo結構?

如果是可用Foo,我可以做

foofoo := &FooFoo{ foo: &Foo{5} } 

甚至

foofoo := &FooFoo{ foo: (*Foo)&Bar{ 5 } } 

但我不能找到一個辦法做到這一點不提Foo

我想我會需要這樣的東西:

foofoo := &FooFoo{ foo: (*typeof(FooFoo.foo)) &Bar{ 5 } } 
+0

您將無法以這種方式強制輸入Bar。也許你可以考慮使用某種接口? –

+1

廠商本身不_「隱藏」類型。你能想出一個真實的例子嗎?你們並沒有真正顯示實際問題。 – Volker

+0

這個問題的一個例子在這裏被描述(https://github.com/golang/go/issues/12432):基本上b中a.go服務的類型'T'在b之外是不可訪問的。 – Fozi

回答

1

你不應該從另一個庫as per this answer設置專用方法。但是,該庫應該有適當的構造函數。圖書館應該有一個看起來像

func FooFooGenerator(appropriateInfo int) FooFoo { 
... Library does the work 
} 
+0

問題不在於它是一個私人領域,而是因爲出售而導致Foo不可用。如果Foo沒有出售,問題就不存在。不幸的是它沒有構造函數。 – Fozi

+0

林不知道你的意思是由vendored。 據我可以告訴你的意思是它的一個私有變量(在結構中有一個小寫字母) 如果它是一個庫中的私人領域,你沒有寫應該有一個方法,或者你沒有使用圖書館的意圖(或寫得不好) 如果它是你寫的圖書館,讓它公開? –

0

你只需要導出一個「構造函數」功能FooFoo並保持你的foo未導出的方法。

func NewFooFoo() *FooFoo { 
    f := &foo{ /* initialize foo */ } 
    return &FooFoo{foo:f} 
} 

然後你包的客戶則要NewFooFoo,並且FooFoo,但不foo訪問。

至於鑄造FooBar,不知道你爲什麼會想這一點,但你可以做到這一點,如果你是Go1.8 +,這樣(*Foo)(&Bar{ 5 })playground