编写一个程序,从文件读取内容到map,然后循环处理读取到的内容,却会出现重复内容

我的流程是这样的:

从文件hash.log中读取infohash到一个map[string]int变量hashlist中,读取格式为:hashlist[“infohash值”]=1,infohash是有重复值的,在读取的时候,如果遇到重复值,hashlist[“infohash”]的值就会自动加1,就编程了hashlist[“infohash”]=2,如果没有重复值,则默认为1

当全部读取完成后,使用range来处理map变量,将其中的每一条infohash写入数据库,使用go来并发处理,但是实际操作时却发现,虽然map变量中没有重复值,但实际操作时,却发现循环一旦开始,每次都只会重复一条数据

我的代码如下:

for {
        //e := os.Chdir("/tmp/torrent/")
        e := os.Chdir(path + "torrent/")
        if e != nil {
            //os.Mkdir("/tmp/torrent/", 0)
            os.Mkdir(path+"torrent/", 0)
        }

        s := time.Now().Format("20060102")

        f, err := os.Open(path + "hash/" + s + ".log")
        if err != nil {
            continue
        }
        defer f.Close()

        var hashList = make(map[string]int)

        bf := bufio.NewReader(f)

        for {
            line, isPrefix, err := bf.ReadLine()
            if err == io.EOF {
                break
            }
            if err != nil {
                panic(err)
            }
            if isPrefix {
                fmt.Println("Line too long")
            }

            if _, ok := hashList[string(line)]; ok {
                hashList[string(line)]++
            } else {
                hashList[string(line)] = 1
            }
        }

        ch := make([]chan int, 128)
        no := 0
        var lis = make(map[string]int)

        for k, v := range hashList {
            _, ok := lis[k]
            if ok {
                continue
            }

            if len(lis) >= 128 {
                lis = make(map[string]int)
            }

            lis[k] = v

            if no >= 128 {
                popChan(ch)
                no = 0
            }

            ch[no] = make(chan int)

            go func(chx chan int, nox int) {
                fmt.Println(k)
                n, err := pullTorrent(k, v)
                if n != 0 {
                    if err != nil {
                        fmt.Println(err)
                    }
                }

                chx <- nox
            }(ch[no], no)

            no++
        }

        time.Sleep(10 * time.Second)
    }

比如我的文件中有:
aaaa
bbbb
cccc
cccc
这样的几条infohash,读取后,循环开始,第一次执行就会全部都是cccc,请问要怎么处理?

共 2 个回复


brucelandor

在用go启动goroutine的时候把k作为参数传进去。

# 0

ylqjgm

啊,非常感谢,已经解决了!

# 1