I also like using generics for API request/response code, ex: https://go.dev/play/p/OWf9eFmg1qF
With generics you don't need to return any/interface{} / type assert at runtime
func Request(req, resp any) error { // send request (http, etc) b, err := json.Marshal(req) if err != nil { return err } log.Printf("sent request %+v - %s", req, b) // read response if err := json.Unmarshal([]byte(`{"success": false, "error": "invalid login"}`), resp); err != nil { return err } return nil }