Oop Golang在具有私有访问的结构中嵌入接口

Oop Golang在具有私有访问的结构中嵌入接口,oop,go,design-patterns,dependency-injection,interface,Oop,Go,Design Patterns,Dependency Injection,Interface,我想以最惯用的方式在Golang中复制以下Java代码: 公共类处理程序{ 专用存储; 私人制图员; 公共处理程序(存储、映射器映射器){ 这个.存储=存储; this.mapper=mapper; } 公共无效handleKey(字符串k){ storage.put(k,mapper.map(k)); } } 接口存储{ 公开作废认沽权(第k串、第v串); 公共字符串get(字符串k); } @功能接口 接口映射器{ 公共字符串映射(字符串a); } MemoryStorage中的私有静态类实

我想以最惯用的方式在Golang中复制以下Java代码:

公共类处理程序{
专用存储;
私人制图员;
公共处理程序(存储、映射器映射器){
这个.存储=存储;
this.mapper=mapper;
}
公共无效handleKey(字符串k){
storage.put(k,mapper.map(k));
}
}
接口存储{
公开作废认沽权(第k串、第v串);
公共字符串get(字符串k);
}
@功能接口
接口映射器{
公共字符串映射(字符串a);
}
MemoryStorage中的私有静态类实现存储{
私有映射表;
公共内存库(){
table=newhashmap();
}
公共作废put(字符串k、字符串v){
表1.put(k,v);
}
公共字符串get(字符串k){
返回表get(k);
}
}
Handler
类仅公开方法
handleKey
。该类的行为通过传递不同的具体
存储
映射器
实现来参数化

阅读之后,我认为这将是嵌入接口intro-structs的一个很好的用途。但是我不知道如何避免将嵌入式接口的方法暴露给
Handler
用户。我可以做类似的事情

类型处理程序结构{
储存
制图员制图员
}
func(h处理程序)句柄(k字符串){
h、 store.Put(k,h.mapper.Map(k))
}
类型存储接口{
Put(k字符串,v字符串)
获取(k字符串)字符串
}
类型映射器接口{
映射(k字符串)字符串
}
输入内存存储{
表映射[字符串]字符串
}
func NewInMemoryStorage()存储{
return&inMemoryStore{table:make(map[string]string)}
}

但是我不能将具体的实现传递给
处理程序
(创建struct literal),因为
存储
映射器
是未报告的。我不想为每个可能的组合创建工厂方法。。。有什么建议吗?

没有嵌入的建议;嵌入在Go中有特定的含义,正如您链接到的“有效Go”部分所解释的。它引用未命名的字段,这些字段和方法可以从其包含类型隐式访问。您的字段是命名的,而不是嵌入的

也就是说,您的两个结构字段,
store
mapper
,不会导出,因此它们不会向定义了
Handler
的包之外的任何用户公开;在这方面,你似乎已经有了你想要的行为

当你说你必须“为每种可能的组合创建工厂方法”时,我不知道你的意思是什么——我看不出有任何必要的理由。您只需要一个工厂方法:

func NewHandler(s Storage, m Mapper) Handler {
    return Handler{store: s, mapper: m}
}
通过向函数传递适当的值,它可以与
存储
映射器
的任何实现组合使用。

公共处理程序(存储存储,映射器映射器){
在Go中将是
新处理程序(存储,映射器映射器)*处理程序{…