gpt4 book ai didi

oop - Golang 在具有私有(private)访问权限的结构中嵌入接口(interface)

转载 作者:数据小太阳 更新时间:2023-10-29 03:39:21 26 4
gpt4 key购买 nike

我想以尽可能最惯用的方式在 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);
}

@FunctionalInterface
interface 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。此类的行为通过传递不同的具体 StorageMapper 实现来参数化。

看完Effective Go - Embedding ,我认为这将是嵌入接口(interface)介绍结构的一个很好的用途。但是我不知道如何避免将嵌入式接口(interface)的方法暴露给 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(创建结构文字),因为 storemapper 未导出。而且我不想为每种可能的组合创建工厂方法...有什么建议吗?

最佳答案

那些不是嵌入的;嵌入在 Go 中有特定的含义,as outlined in the spec ,并且如您链接到的 Effective Go 部分中所述。它引用未命名的字段,其字段和方法可从其包含类型隐式访问。您的字段是命名的,而不是嵌入的。

就是说,您的两个结构字段storemapper 没有导出,所以它们不会暴露给所在包之外的任何用户Handler 已定义;在这方面你似乎已经有了你想要的行为。

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

func NewHandler(s Storage, m Mapper) Handler {
return Handler{store: s, mapper: m}
}

通过将适当的值传递给函数,它可以与 StorageMapper 实现的任意组合一起使用。

关于oop - Golang 在具有私有(private)访问权限的结构中嵌入接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57791917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com