Golang IF语句中实现类LIKE多选项过滤的最佳实践咨询
Go 多值匹配实现方案
Go 没有原生支持你示例中的like语法,不过可以通过以下几种方案实现同等效果,不同场景对应不同的最佳实践:
方案1:Map集合匹配(性能最优,推荐绝大多数场景使用)
提前把需要匹配的值存入map作为键,查询时间复杂度为O(1),匹配项越多优势越明显,用空结构体作为值不会占用额外内存:
s1 := "lorem ipsum" sum := 0 // 初始化匹配集合 matchSet := map[rune]struct{}{ 'a': {}, 'i': {}, 'u': {}, 'e': {}, 'o': {}, } for _, v := range s1 { if _, ok := matchSet[v]; ok { sum += 1 } }
方案2:slices.Contains匹配(Go 1.21+支持,适合少量匹配项场景)
如果匹配项只有几个,用标准库slices的Contains方法写法最简洁易读,缺点是查询时间复杂度为O(n):
import "slices" s1 := "lorem ipsum" sum := 0 matchList := []rune{'a', 'i', 'u', 'e', 'o'} for _, v := range s1 { if slices.Contains(matchList, v) { sum += 1 } }
方案3:正则匹配(适合复杂模糊匹配场景)
如果你需要实现类似SQL LIKE的模糊匹配(比如前缀、后缀、包含特定规则的匹配),可以用标准库regexp包实现:
import "regexp" s1 := "lorem ipsum" // 正则匹配所有元音字符 re := regexp.MustCompile(`[aiueo]`) sum := len(re.FindAllString(s1, -1))
这种方式适合规则复杂的匹配场景,性能低于前两种,不建议用来做简单的固定值匹配。
内容的提问来源于stack exchange,提问作者Nanda Fitra
相关产品推荐
相关产品推荐

