Нарушает ли "Accept Interfaces" устаревшие инструменты?

Устаревание

Поддерживаемый способ пометки функций как устаревших выглядит примерно так:

      type MyStruct struct {
}

// MyFunc returns hello
// Deprecated: Use YourFunc
func (m MyStruct) MyFunc() string {
  return "hello"
}

Современные IDE будут выделять любое использование этой функции, а линтеры также могут вызывать предупреждения (я лично это не проверял)

Принимайте интерфейсы. Возвратные структуры.

Популярная передовая практика - «Принимать интерфейсы. Возвращать структуры». - что имеет тенденцию поощрять твердотельный дизайн в программном обеспечении.

Однако следующий код, который следует этой передовой практике, скрывает предупреждение об устаревании:

      
// MyInterface specifies a single function that we require from a dependency
type MyInterface interface {
    MyFunc() string
}

func main() {

    var v MyInterface
    v = MyStruct{}
    v.MyFunc()

}

Вопрос

Есть ли решение этой проблемы?

Если бы я был, например, сопровождающим библиотеки: как я могу гарантировать, что мои предупреждения об устаревании увидят пользователи библиотеки, которые также следуют лучшим практикам и определяют свои собственные интерфейсы зависимостей.

1 ответ

Это кажется логичным, поскольку метод интерфейса не устарел. Добавление Deprecated:в этом случае может помочь строка функции интерфейса (не проверял, так как VSCode этого еще не делает).

      // MyInterface specifies a single function that we require from a dependency
type MyInterface interface {
    // Deprecated: use YourFunc
    MyFunc() string
}

В этом случае, поскольку интерфейс имеет только одну функцию, вы должны отказаться от всего этого. Я знаю, что поддерживается godoc/pkg.go.dev, например, Queryer .

      // MyInterface specifies a single function that we require from a dependency
// Deprecated: use YourInterface
type MyInterface interface {
    MyFunc() string
}
Другие вопросы по тегам