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