package inheritance import "fmt" type Model struct{} type MyModel struct { Model } type MethodInitInterface interface { Init(dbConn int) } type RepoBase[T interface{}] struct { DbConn int GetMethod[T] ListMethod[T] methods []MethodInitInterface } func (b *RepoBase[T]) InitMethods(dbConn int) { for _, method := range b.methods { method.Init(dbConn) } } type CRUDRepo[T interface{}] struct { RepoBase[T] SaveMethod[T] } func (m *CRUDRepo[T]) Init(dbConn int) { m.methods = []MethodInitInterface{&m.GetMethod, &m.ListMethod, &m.SaveMethod} m.InitMethods(dbConn) } func DoInheritanceTest() { repo := RepoBase[MyModel]{ DbConn: 111, // GetMethod: GetMethod{ // DbConn: 666, // }, // ListMethod: ListMethod{ // DbConn: 777, // }, } repo.GetMethod.Init(888) repo.ListMethod.Init(888) repo.GetMethod.Get() repo.List() fmt.Printf("outside Base: %d\n", repo.DbConn) fmt.Printf("outside GetMethod: %d\n", repo.GetMethod.DbConn) fmt.Printf("outside ListMethod: %d\n", repo.ListMethod.DbConn) fmt.Println("----------------") crudRepo := CRUDRepo[MyModel]{} crudRepo.Init(999) crudRepo.Get() crudRepo.List() crudRepo.Save() fmt.Printf("outside GetMethod: %d\n", crudRepo.GetMethod.DbConn) fmt.Printf("outside ListMethod: %d\n", crudRepo.ListMethod.DbConn) fmt.Printf("outside SaveMethod: %d\n", crudRepo.SaveMethod.DbConn) // repo.DbConn = 123 // repo.SomeGetVar = 456 // repo.DoSomething() }