Одну функцию можно принять по сути двумя способами: передав саму функцию или передав структуру, а внутри пакета мы уже используем интерфейс, в котором есть нужная нам функция.
Покажу наглядно.
Вот первый способ:
package printhello
import "fmt"
type getNameFunc func() string
type PrintHello struct {
getName getNameFunc
}
func New(getName getNameFunc) *PrintHello {
return &PrintHello{
getName: getName,
}
}
func (ph *PrintHello) Print() {
fmt.Printf("Hello %s\n", ph.getName())
}
А вот второй способ:
package printhello
import "fmt"
type getNamer interface {
GetName() string
}
type PrintHello struct {
getNamer getNamer
}
func New(getNamer getNamer) *PrintHello {
return &PrintHello{
getNamer: getNamer,
}
}
func (ph *PrintHello) Print() {
fmt.Printf("Hello %s\n", ph.getNamer.GetName())
}
Что лучше?