我想以最慣用的方式在 Golang 中復制以下 Java 代碼:public class Handler { private Storage storage; private Mapper mapper; public Handler(Storage storage, Mapper mapper) { this.storage = storage; this.mapper = mapper; } public void handleKey(String k) { storage.put(k, mapper.map(k)); }}interface Storage { public void put(String k, String v); public String get(String k);}@FunctionalInterfaceinterface Mapper { public String map(String a);}private static class InMemoryStorage implements Storage { private Map<String, String> table; public InMemoryStorage() { table = new HashMap<>(); } public void put(String k, String v) { table.put(k, v); } public String get(String k) { return table.get(k); }}Handler類只公開方法handleKey。該類的行為通過傳遞不同的具體Storage和Mapper實現來參數化。在閱讀了effective Go - Embedding后,我認為這將是嵌入接口介紹結構的一個很好的用途。但我不知道如何避免將嵌入式接口的方法暴露給Handler用戶。我可以做類似的事情type Handler struct { store Storage mapper Mapper}func (h Handler) Handle(k string) { h.store.Put(k, h.mapper.Map(k))}type Storage interface { Put(k string, v string) Get(k string) string}type Mapper interface { Map(k string) string}type inMemoryStorage { table map[string]string}func NewInMemoryStorage() Storage { return &inMemoryStore{table: make(map[string]string)}}但隨后我無法將具體實現傳遞給Handler(創建結構文字),因為store和mapper未導出。我不想為每個可能的組合創建工廠方法......有什么建議嗎?
1 回答

慕少森
TA貢獻2019條經驗 獲得超9個贊
這些不是嵌入的;嵌入在 Go 中具有特定含義,如規范中所述,以及您鏈接到的有效 Go 部分中的解釋。它指的是未命名的字段,其字段和方法可以從其包含類型隱式訪問。您的字段是命名的,而不是嵌入的。
也就是說,您的兩個結構體字段store和mapper不會導出,因此它們不會暴露給Handler定義的包之外的任何用戶;在這方面你似乎已經有了你想要的行為。
當您說必須“為每種可能的組合創建工廠方法”時,我不確定您的意思是什么 - 我認為沒有任何必要的理由。您只需要一種工廠方法:
func NewHandler(s Storage, m Mapper) Handler {
? ? return Handler{store: s, mapper: m}
}
通過將適當的值傳遞給函數,可以將其Storage與 和的實現的任意組合一起使用。Mapper
- 1 回答
- 0 關注
- 134 瀏覽
添加回答
舉報
0/150
提交
取消