@savelikhatskov

GoLand не определяет тип generic на выходе из метода?

Пытаюсь сделать generic репозиторий.
При вызове метода NewRepository он возвращает необходимый тип, то есть Repository[User]
Далее при вызове метода Get, Golang так же возвращает необходимый тип и при обращении к переменной user в методе Run, GoLand определяет этот тип как *T и ругается на несуществующие поля этой переменной. А вроде должен определять как User.
6242dd423a1ce764438114.png
6242dc13e96a0628514894.png

Но если скомпилировать код - он работает.

Есть какой-то обходной путь или решение, как заставить GoLand определить тип?

Пример кода:

type Group struct {
	gorm.Model
	Name string
}

type User struct {
    gorm.Model
    ID        int   
    UserName  string
    FirstName string
    LastName  string
    Email     string
}

type ModelsInterface interface {
	User | Group
}

type Repository[T any] struct {
	db *gorm.DB
}

func (r *Repository[T]) Get(id uint) *T {
	var t T
	r.db.Where("id = ?", id).First(&t)
	return &t
}

func NewRepository[T ModelsInterface](db *gorm.DB) *Repository[T] {
	return &Repository[T]{
		db: db,
	}
}

func Run() {
	userRepository := NewRepository[User](model.DB)
	user := userRepository.Get(1)

	fmt.Println(user.FirstName)
}
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
@savelikhatskov Автор вопроса
Вот issue https://youtrack.jetbrains.com/issue/GO-12404
Это решается с установкой 2022.1 Beta
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы