我来自PHP背景并试图构建一个小工具,允许我根据通过CSV文件提供的黑名单过滤关键字列表。我设法在PHP中做到这一点,但它有一些速度限制。所以我决定尝试使用Golang。我已成功打开CSV文件fmt.Println
两个关键字和黑名单的内容,并设法将每个关键字与每个黑名单关键字进行比较。但我面临的问题是,我可以弄清楚如何构建类似的动态关联数组。
function compareKeywords($keyword, $filters) {
$matches = [];
foreach($filters as $filter) {
$matches[] = strpos($keyword, $filter);
}
$matches = array_filter($matches);
if(empty($matches)) {
return $keyword
}
}
此功能只是检查关键字是否完全或部分匹配列入黑名单的关键字,如果它与列入该关键字的黑名单关键字不匹配,然后将其添加到CSV文件中。
我花了相当多的时间尝试在Golang中创建类似的函数,但我很难模仿PHP中的关联数组。
我提出了稍微不同的函数,它接受关键字而不是单个关键字以及过滤器并使用嵌套循环。
func compare(keywords [][]string, filterKeywords [][]string) (keywordMap //no sure what type it should be) {
matchFilters := make(map[string]string)
keywordMap := make(map[string]string)
for _, keyword := range keywords {
for _, filter := range filterKeywords {
if convStr(keyword) == convStr(filter) {
// here i want to store matches filters
}
}
}
//Check if matchFilters empty and return filtered keywordMap
return
}
我知道我的代码可能看起来很冗长,看起来有些蹩脚。但任何对我应该采取的方向的建议都将非常感激。
答案 0 :(得分:0)
我不懂PHP,但就我从PHP代码中理解,Go等效应该是:
func compare(keyword string, filters map[string]struct{}) (string, error) {
// value, ok := myMap[key]
// this is Go syntax for checking the existance of a key in a map - check the ok variable.
_, filterMatched := filters[keyword]
if filterMatched {
return ``, fmt.Errorf("keyword %s got filtered", keyword)
}
return keyword, nil
}
换句话说,你可以使用map
类型,但是有一个帮助函数可以清除我们的意图。
答案 1 :(得分:0)
以下是包含一些优化的工作代码,请在The Go Playground:
上进行尝试package main
import (
"fmt"
"strings"
)
func main() {
filters := []string{"aaa", "bbb", "ccc"}
fmt.Println(compareKeywords("a", filters)) // ""
fmt.Println(compareKeywords("d", filters)) // "d"
}
func compareKeywords(keyword string, filters []string) string {
for _, filter := range filters {
if strings.Index(filter, keyword) >= 0 {
return ""
}
}
return keyword
}
输出:
d
并查看strings.Index
文档:
func Index(s, sep string) int
索引返回s中第一个sep实例的索引,如果s中不存在sep,则返回-1。