Дженерики Голанга

попытка создать абстрактную службу аутентификации с использованием универсального типа. Я хотел создать пакет Auth, который будет иметь метод New() для инициализации, но в настоящее время столкнулся с проблемой, которую я могу решить. У кого-нибудь есть идеи, возможно ли это вообще, и если это вообще способ решения проблемы?

type Register[T any] interface {
    SignUp(T) (*AuthEntity, error)
}

type AuthEntity struct {
    ID        string
    UpdatedAt time.Time
    CreatedAt time.Time
}

type AuthService[T any] struct {
    Register[T]
}

type PasswordStrategy struct{}
type SignUpViaPassword struct {
    Email    string
    Password string
}

func (s PasswordStrategy) SignUp(signUpData SignUpViaPassword) (*AuthEntity, error) {
    return &AuthEntity{ID: "[email protected]"}, nil
}

func New[T any](register Register[T]) AuthService[T] {
    return AuthService[T]{
        Register: register,
    }
}

type GoogleStrategy struct{}
type SignUpViaGoogle struct {
    Token string
}

func (s GoogleStrategy) SignUp(signUpData SignUpViaGoogle) (*AuthEntity, error) {
    return &AuthEntity{}, nil
}

func main() {
    // This works as expected
    authService := AuthService[SignUpViaPassword]{
        Register: PasswordStrategy{},
    }
    entity, err := authService.SignUp(SignUpViaPassword{Password: "Kako ide", Email: "[email protected]"})
    if err != nil {
        log.Println(err)
    }
    log.Println(entity)
    // This also works as expected
    googleAuthService := AuthService[SignUpViaGoogle]{
        Register: GoogleStrategy{},
    }
    entity2, err := authService.SignUp(SignUpViaPassword{Password: "Kako ide", Email: "[email protected]"})
    if err != nil {
        log.Println(err)
    }
    log.Println(entity2)

    // this doesn't work and returns error  type PasswordStrategy of PasswordStrategy{} does not match Register[T] (cannot infer T)
    New(PasswordStrategy{})
    New(GoogleStrategy{})
}

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Он не может сделать вывод, каким должен быть T, поэтому вы можете указать его явно:

New[SignUpViaPassword](PasswordStrategy{})

Я знаю об этом, но в этом случае я не могу передать другую реализацию интерфейсов, таких как GoogleSignUpStrategy.

Petar Arandjic 11.02.2023 22:47

Почему нет? Однако это вернет другой тип службы.

Burak Serdar 11.02.2023 22:55

Я отредактировал рассматриваемый код, возможно, это даст вам лучшее представление о том, чего я хочу достичь.

Petar Arandjic 12.02.2023 07:29

@PetarArandjic New[SignUpViaPassword](PasswordStrategy{}) и New[SignUpViaGoogle](GoogleStrategy{}) у вас не работают?

mkopriva 12.02.2023 08:08

Другие вопросы по теме