1 go build main.go
2 ! stdout .
3 ! stderr .
4
5 -- main.go --
6 package main
7
8 import (
9 "demo/registry"
10 )
11
12 func main() {
13 _ = registry.NewUserRegistry()
14 }
15
16 -- go.mod --
17 module demo
18
19 go 1.24
20
21 -- model/user.go --
22 package model
23
24 type User struct {
25 ID int
26 }
27
28 func (c *User) String() string {
29 return ""
30 }
31
32 -- ordered/map.go --
33 package ordered
34
35 type OrderedMap[K comparable, V any] struct {
36 m map[K]V
37 }
38
39 func New[K comparable, V any](options ...any) *OrderedMap[K, V] {
40 orderedMap := &OrderedMap[K, V]{}
41 return orderedMap
42 }
43
44 -- registry/user.go --
45 package registry
46
47 import (
48 "demo/model"
49 "demo/ordered"
50 )
51
52 type baseRegistry = Registry[model.User, *model.User]
53
54 type UserRegistry struct {
55 *baseRegistry
56 }
57
58 type Registry[T any, P PStringer[T]] struct {
59 m *ordered.OrderedMap[string, P]
60 }
61
62 type PStringer[T any] interface {
63 *T
64 String() string
65 }
66
67 func NewRegistry[T any, P PStringer[T]]() *Registry[T, P] {
68 r := &Registry[T, P]{
69 m: ordered.New[string, P](),
70 }
71 return r
72 }
73
74 func NewUserRegistry() *UserRegistry {
75 return &UserRegistry{
76 baseRegistry: NewRegistry[model.User](),
77 }
78 }
79
View as plain text