Скажем, у меня есть следующие структуры
package foobar
type Foo struct{}
type Bar struct{}
func (*Bar) Read(p []byte) (n int, err error) {
return 0, nil
}
Где-то в моем приложении я намереваюсь использовать одну из этих структур, как это
package consumer
type DoOptions struct {
bar io.Reader
}
func Do(opts *DoOptions) {
fmt.Println(opts)
}
Моя цель - создать контейнер общих зависимостей и пусть клиенты определяют, какие зависимости они будут sh извлекать из него.
package main
type dependencyContainer struct {
foo *Foo
bar *Bar
}
func main() {
s := &dependencyContainer{
foo: &foobar.Foo{},
bar: &foobar.Bar{},
}
consumer.Do(s)
}
Но, конечно, это не работает так:
cannot use s (variable of type *dependencyContainer) as *DoOptions value in argument to consumer
Есть ли способ для мне достичь этого?
Глядя на альтернативы, и все они довольно дерзкие.
- Интерфейсы могут иметь только методы в них
context.Context
означает много ненужного приведения и API функции становится беспорядочным - Наличие нескольких аргументов функции может быть высоким Поддерживайте значение порядка импорта и повторения, пока вы детализируете свойства вниз по вашему графику зависимостей