go build main.go ! stdout . ! stderr . -- main.go -- package main import ( "demo/registry" ) func main() { _ = registry.NewUserRegistry() } -- go.mod -- module demo go 1.24 -- model/user.go -- package model type User struct { ID int } func (c *User) String() string { return "" } -- ordered/map.go -- package ordered type OrderedMap[K comparable, V any] struct { m map[K]V } func New[K comparable, V any](options ...any) *OrderedMap[K, V] { orderedMap := &OrderedMap[K, V]{} return orderedMap } -- registry/user.go -- package registry import ( "demo/model" "demo/ordered" ) type baseRegistry = Registry[model.User, *model.User] type UserRegistry struct { *baseRegistry } type Registry[T any, P PStringer[T]] struct { m *ordered.OrderedMap[string, P] } type PStringer[T any] interface { *T String() string } func NewRegistry[T any, P PStringer[T]]() *Registry[T, P] { r := &Registry[T, P]{ m: ordered.New[string, P](), } return r } func NewUserRegistry() *UserRegistry { return &UserRegistry{ baseRegistry: NewRegistry[model.User](), } }