用 iota 写出漂亮的HTTP状态码分组常量

1次阅读

Go 中用 iota 定义 HTTP 状态码分组常量,按 RFC 7231 分类(1xx–5xx),每组独立 iota 块实现基数偏移,辅以注释、自定义类型 StatusCode 和分类方法,兼顾简洁性、可读性、类型安全与可维护性。

用 iota 写出漂亮的 HTTP 状态码分组常量

在 Go 中用 iota 定义 HTTP 状态码 分组常量,既简洁又语义清晰。关键是按 RFC 7231 分类(1xx、2xx、3xx、4xx、5xx),利用 iota 的自增特性配合位移或偏移,让每组从对应基数开始,同时保持可读性和类型安全。

基础分组:每组独立 iota 重置

最直观的方式是为每组状态码单独声明一个 iota 块,避免跨组干扰:

const (// 1xx Informational     StatusContinue           = 100 + iota     StatusSwitchingProtocols     StatusProcessing) 

const (// 2xx Success StatusOK = 200 + iota StatusCreated StatusAccepted StatusNonAuthoritativeInfo StatusNoContent StatusResetContent StatusPartialContent)

const (// 3xx Redirection StatusMultipleChoices = 300 + iota StatusMovedPermanently StatusFound StatusSeeOther StatusNotModified StatusUseProxy _ // StatusSwitchProxy 已废弃,跳过 StatusTemporaryRedirect StatusPermanentRedirect)

const (// 4xx Client Error StatusBadRequest = 400 + iota StatusUnauthorized StatusPaymentRequired StatusForbidden StatusNotFound StatusMethodNotAllowed StatusNotAcceptable StatusProxyAuthRequired StatusRequestTimeout StatusConflict StatusGone StatusLengthRequired StatusPreconditionFailed StatusPayloadTooLarge StatusURITooLong StatusUnsupportedMediaType StatusRangeNotSatisfiable StatusExpectationFailed StatusTeapot // 418 是彩蛋,但合法 StatusMisdirectedRequest StatusUnprocessableEntity StatusLocked StatusFailedDependency StatusTooEarly StatusUpgradeRequired StatusPreconditionRequired StatusTooManyRequests StatusRequestHeaderFieldsTooLarge StatusUnavailableForLegalReasons)

const (// 5xx Server Error StatusInternalServerError = 500 + iota StatusNotImplemented StatusBadGateway StatusServiceUnavailable StatusGatewayTimeout StatusHTTPVersionNotSupported StatusVariantAlsoNegotiates StatusInsufficientStorage StatusLoopDetected StatusNotExtended StatusNetworkAuthenticationRequired)

增强可读性:加注释与空行分隔

在每组开头用注释标明类别和 RFC 来源,在关键码后加简短说明(如弃用、非标准、彩蛋),提升维护性:

// 4xx Client Error (RFC 7231, RFC 4918, RFC 6585, RFC 7538, RFC 7725) const (StatusBadRequest = 400 + iota // 400 Bad Request     StatusUnauthorized             // 401 Unauthorized     StatusPaymentRequired          // 402 Payment Required (not used, but reserved)     StatusForbidden                // 403 Forbidden     StatusNotFound                 // 404 Not Found     // …… 其他略 )

类型安全:封装为自定义类型

定义 StatusCode 类型,支持方法、格式化和校验,避免误用 int:

type StatusCode int 

func (s StatusCode) String() string { switch s { case StatusOK: return "200 OK" case StatusNotFound: return "404 Not Found" case StatusInternalServerError: return "500 Internal Server Error" default: return fmt.Sprintf("%d Unknown", int(s)) } }

func (s StatusCode) IsClientError() bool { return s>= 400 && s <500} func (s StatusCode) IsServerError() bool { return s>= 500 && s <600} func (s StatusCode) IsSuccess() bool { return s>= 200 && s <300}

实用技巧:快速判断分类

无需硬 编码 范围,用常量表达式体现语义:

  • 1xx 组:用 StatusContinue / 100 == 1 判断(所有 1xx 都满足)
  • 通用分类函数:基于除法或位运算,例如 (int(s) / 100) * 100 得到分类基值(100、200……)
  • 生成文档:搭配 go:generate 和模板,自动从常量生成 Markdown 表格

text=ZqhQzanResources