string - 如何检查文本是否包含 Golang 列表中的任何单词?
问题描述
我想检查用户提交的文本中是否有垃圾邮件。所以这是我写的函数:
func TextHasSpamWords(text string, spamWords []string) bool {
removePunctuation := func(r rune) rune {
if strings.ContainsRune(".,:;", r) {
return -1
} else {
return r
}
}
text = strings.Map(removePunctuation, text)
sort.Strings(spamWords)
for _, word := range text {
for _, sapmWord := range spamWords {
if word == sapmWord {
return true
}
}
}
}
但我明白mismatched type rune and string
了word == sapmWord
。我知道这是因为removePunctuation
返回无法与字符串(unit8)比较的符文(又名 int32)。但是删除标点符号对于该功能的工作是必不可少的,所以我想知道如何解决这个问题?或者也许有一种更惯用的方式来做到这一点?
解决方案
考虑使用地图进行查找
lookupSpam := make(map[string]bool)
for _, v := range spamWords {
lookupSpam[v] = true
}
然后代替
for _, word := range textArr {
for _, sapmWord := range spamWords {
if word == sapmWord {
return true
}
}
}
可以使用这样的东西
for _, word := range textArr {
_,found:=lookupSpam[word]
if found {
return true
}
}
如果您重复检查同一组单词,则设置一次地图并重复使用它
推荐阅读
- java - Sonarqube 集成到 gitlab.com 上的私人仓库
- angular - 如何在 Angular 项目之间进行路由?
- matlab - 对于高度非线性但不是随机的问题,同一个 matlab ode 求解器能否给出不同的结果?
- javascript - 如何使用 sinonjs 验证对 super 的调用?
- sql - 日期的串联
- mongodb - Mongo-go-driver GridFS 元数据
- javascript - 基于 Javascript 中的用户输入获取输入表单的值和 id 的函数
- git - 为什么Git不添加文件夹?
- javascript - 优化图像以适应最大文件大小
- sql-server - 简单的多对多问题