将嵌套循环内生成的数据存储在地图或切片中

时间:2016-07-08 08:27:29

标签: php go

我来自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

}

我知道我的代码可能看起来很冗长,看起来有些蹩脚。但任何对我应该采取的方向的建议都将非常感激。

2 个答案:

答案 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。