亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 在具有私有訪問權限的結構中嵌入接口

Golang 在具有私有訪問權限的結構中嵌入接口

Go
侃侃爾雅 2023-07-17 17:46:10
我想以最慣用的方式在 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


查看完整回答
反對 回復 2023-07-17
  • 1 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號