| 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](), |
| } |
| } |