Go 1.21中slices.Contains类型推断失败,slog日志验证器报错求助
修复slices.Contains检查slog.Level时的类型推断错误
你遇到的编译器错误是因为slices.Contains的第二个参数类型不匹配——value是interface{}类型,而切片元素是slog.Level,编译器无法自动完成类型推断,导致无法满足泛型约束。
修复方案1:保留反射检查,添加类型断言
既然已经通过反射确认了value的类型是slog.Level,可以直接将value断言为具体类型后传入slices.Contains:
import ( "log/slog" "reflect" "slices" ) func IsLogLevel(value interface{}) bool { logLevelType := reflect.TypeOf(slog.LevelDebug) if reflect.TypeOf(value) != logLevelType { return false } // 类型断言,已确认类型匹配,无需处理错误 level, _ := value.(slog.Level) logLevels := []slog.Level{ slog.LevelDebug, slog.LevelInfo, slog.LevelWarn, slog.LevelError, } return slices.Contains(logLevels, level) }
更优方案:用类型断言替代反射
反射的性能开销比类型断言大,直接用类型断言同时完成类型检查和类型转换,代码更简洁高效:
import ( "log/slog" "slices" ) func IsLogLevel(value interface{}) bool { level, ok := value.(slog.Level) if !ok { return false } logLevels := []slog.Level{ slog.LevelDebug, slog.LevelInfo, slog.LevelWarn, slog.LevelError, } return slices.Contains(logLevels, level) }
补充说明
Go 1.21的slices.Contains确实支持泛型,但要求第二个参数的类型必须和切片元素类型完全一致。interface{}类型的变量无法直接匹配泛型参数的类型约束,因此必须显式转换为具体类型才能使用。
内容的提问来源于stack exchange,提问作者baitendbidz
相关产品推荐
相关产品推荐

