package main import ( "encoding/json" "fmt" "io" "net/http" "ttime/internal/database" _ "github.com/mattn/go-sqlite3" ) // The button state as represented in memory type ButtonState struct { PressCount int `json:"pressCount"` } // This is what a handler with a receiver looks like // Keep in mind that concurrent state access is not (usually) safe // And will in practice be guarded by a mutex func (b *ButtonState) pressHandler(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { b.PressCount++ } response, err := json.Marshal(b) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } fmt.Println("Request received") io.WriteString(w, string(response)) } // This is what a handler looks like func handler(w http.ResponseWriter, r *http.Request) { fmt.Println("Request received") io.WriteString(w, "This is my website!\n") } func main() { database.DbConnect() b := &ButtonState{PressCount: 0} // Mounting the handlers fs := http.FileServer(http.Dir("static")) http.Handle("/", fs) http.HandleFunc("/hello", handler) http.HandleFunc("/api/button", b.pressHandler) // Start the server on port 8080 println("Currently listening on http://localhost:8080") println("Visit http://localhost:8080/hello to see the hello handler in action") println("Visit http://localhost:8080/button to see the button handler in action") println("Press Ctrl+C to stop the server") err := http.ListenAndServe(":8080", nil) if err != nil { panic(err) } }