Касательно структуры - можно почитать разные тексты на эту тему и определиться с тем, как поступить грамотнее.
>почему в реализациях нельзя на него ссылаться?
А зачем на него там ссылаться? Интерфейс по сути просто описывает условия, которым что-то должно удовлетворять.
Например в api.go у вас что-то такое:
type CommonApi interface {
Request() error
}
api1.go
import "errors"
type Api struct {}
func (Api) Request() error {
return errors.New("Test")
}
А в handler.go нечто вроде:
import "<path>/api/v1"
func handle(c CommonApi) error{
return c.Request()
}
func main() {
api := v1.Api{}
handle(api)
}
Всё.