用 iota 定义日志级别常量简洁可读、支持比较与字符串映射;配合自定义类型 Level 和 String() 方法实现类型安全与友好输出;天然支持阈值判断、配置解析和扩展(如 Trace、预留值、起始偏移)。
用 iota 定义日志级别常量,既简洁又具备可读性与可扩展性,还能天然支持等级比较和字符串映射。
从 0 开始递增,让 Debug 最低、Error 最高,符合“数值越小越详细”的常见约定:
const ( Debug iota // 0 Info // 1 Warn // 2 Error // 3 )
这样定义后,level 就能直观表示“只输出 Info 及更高级别”,逻辑清晰,无需硬编码数字。
实现 String() string 方法,让 fmt.Println(Debug) 输出 "Debug" 而非 0:
func (l Level) String() string {
switch l {
case Debug:
return "DEBUG"
case Info:
return "INFO"
case Warn:
return "WARN"
case Error:
return "ERROR"
default:
return "UNKNOWN"
}
}

type Level int const ( Debug Level = iota Info Warn Error )
利用整数值天然可比性,轻松实现日志开关逻辑:
if level >= Warn { log.Warn(...) } —— 只在 Warn 及以上才记录--log-level=2),用 Level(v) 转换即可if level Error { ... }
若需插入 Trace 或预留空位,iota 依然灵活:
const ( Trace Level = iota // 0 Debug // 1 Info // 2 _ // 3(预留) Warn // 4 Error // 5 Fatal // 6 )
或者按实际语义偏移起始值:
const ( Debug Level = iota + 1 // 从 1 开始,0 表示 “未设置” Info Warn Error )
避免 0 值造成歧义(例如结构体零值默认是 Debug=0,但你希望它代表“未配置”)。
不复杂但容易忽略:加一行类型定义 + iota + Stringer,日志系统就多了可读性、安全性与维护性。