1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| package main
import ( "encoding/json" "fmt" "log" "net/http" "strconv" "sync" "time" )
type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` CreatedAt time.Time `json:"created_at"` }
type UserStore struct { mu sync.RWMutex users map[int]User nextID int }
func NewUserStore() *UserStore { return &UserStore{ users: make(map[int]User), nextID: 1, } }
func (s *UserStore) Create(name, email string) User { s.mu.Lock() defer s.mu.Unlock()
user := User{ ID: s.nextID, Name: name, Email: email, CreatedAt: time.Now(), } s.users[user.ID] = user s.nextID++ return user }
func (s *UserStore) GetAll() []User { s.mu.RLock() defer s.mu.RUnlock()
result := make([]User, 0, len(s.users)) for _, u := range s.users { result = append(result, u) } return result }
type UserHandler struct { store *UserStore }
func (h *UserHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json")
switch r.Method { case http.MethodGet: users := h.store.GetAll() json.NewEncoder(w).Encode(users)
case http.MethodPost: var req struct { Name string `json:"name"` Email string `json:"email"` } if err := json.NewDecoder(r.Body).Decode(&req); err != nil { http.Error(w, `{"error":"invalid request"}`, http.StatusBadRequest) return }
user := h.store.Create(req.Name, req.Email) w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(user)
default: http.Error(w, `{"error":"method not allowed"}`, http.StatusMethodNotAllowed) } }
func loggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) log.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start)) }) }
func main() { store := NewUserStore() handler := &UserHandler{store: store}
http.Handle("/api/users", loggingMiddleware(handler))
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, `{"status":"ok"}`) })
addr := ":8080" log.Printf("服务器启动在 %s", addr) log.Fatal(http.ListenAndServe(addr, nil)) }
|