Пытаюсь сделать generic репозиторий.
При вызове метода NewRepository он возвращает необходимый тип, то есть Repository[User]
Далее при вызове метода Get, Golang так же возвращает необходимый тип и при обращении к переменной user в методе Run, GoLand определяет этот тип как *T и ругается на несуществующие поля этой переменной. А вроде должен определять как User.
Но если скомпилировать код - он работает.
Есть какой-то обходной путь или решение, как заставить 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)
}