我在golang中有一个时髦的问题。本质上,我有一部分代表文件路径的字符串。然后,我对这些文件路径运行一只猫,以在排序,重复数据删除等之前合并文件。

这是代码部分(其中“applicableReductions”是字符串 slice ):

    applicableReductions := []string{}

    for _, fqFromListName := range fqFromListNames {
         filePath := GetFilePath()
         //BROKE CODE GOES HERE
    }
    applicableReductions = append(applicableReductions, filePath)

    fileOut, err := os.Create(toListWriteTmpFilePath)
    if err != nil {
        return err
    }
    cat := exec.Command("cat", applicableReductions...)
    catStdOut, err := cat.StdoutPipe()
    if err != nil {
        return err
    }
    go func(cat *exec.Cmd) error {
        if err := cat.Start(); err != nil {
            return fmt.Errorf("File reduction error (cat) : %s", err)
        }
        return nil
    }(cat)

    // Init Writer & write file
    writer := bufio.NewWriter(fileOut)
    defer writer.Flush()

    _, err = io.Copy(writer, catStdOut)
    if err != nil {
        return err
    }

    if err = cat.Wait(); err != nil {
        return err
    }

    fDiff.StandardiseData(fileOut, toListUpdateFolderPath, list.Name)

以上工作正常。当我尝试将新的ele追加到数组时,问题就来了。我有一个单独的函数,该函数从db内容创建一个新文件,然后将其添加到applyReductions slice 中。
func RetrieveDomainsFromDB(collection *Collection, listName, outputPath string) error {
    domains, err := domainReviews.GetDomainsForList(listName)
    if err != nil {
        return err
    }

    if len(domains) < 1 {
        return ErrNoDomainReviewsForList
    }

    fh, err := os.OpenFile(outputPath, os.O_RDWR, 0774)
    if err != nil {
        fh, err = os.Create(outputPath)
        if err != nil {
            return err
        }
    }
    defer fh.Close()
    _, err = fh.WriteString(strings.Join(domains, "\n"))
    if err != nil {
        return err
    }

    return nil
}

如果我调用上面的函数并将filePath附加到applyReduction slice中,它就在其中,但不会被cat调用。

需要澄清的是,当我在下面输入“BROKE CODE”的地方时:
    if dbSource {
        err = r.RetrieveDomainsFromDB(collection, ToListName, filePath)
        if err != nil {
                return err
                continue
            }
      }

执行fmt.Println(applicableReductions)时可以看到文件路径,但是在cat输出文件中看不到文件内容的内容。

我认为可能是文件写入延迟,所以我尝试添加time.wait,这没有帮助。但是我发现的解决方案是对 slice 进行排序,例如在调用exec cat上方的这段代码解决了问题,但我不知道为什么:
sort.Strings(applicableReductions)

我已经确认所有文件在成功和不成功运行中都存在,唯一的区别是没有排序,最后附加文件的内容丢失了

非常感谢go-pro的解释,如果您需要更多信息,请告诉我,请进行调试-非常高兴了解

更新
有人建议这与这里是相同的问题:Golang append an item to a slice,我想我在那里明白了这个问题,我并不是说这是不一样的,但是我看不到发生同样的事情-所讨论的 slice 没有从外部触及主要功能(例如,在RetrieveDomainsFromDB函数中不对 slice 进行编辑),我在循环之前创建 slice ,在循环内附加到 slice ,然后在循环之后使用它-我在顶部添加了一个示例以显示 slice 如何内置-如果是这种情况,请有人能说明该 slice 的复制位置

最佳答案

更新并关闭
请关闭问题-该问题与字符串 slice 的使用无关。原来,我是在bufio-writer刷新之前从最终输出文件中读取的(在函数结束时,在函数返回之前推迟刷新)

我认为排序只是重新安排了问题,所以我没有注意到它仍然存在,也没有给缓冲区刷新时间。无论哪种方式,现在都可以通过手动调用冲洗进行排序。

感谢您提供的所有帮助

关于go - Golang-为什么字符串 slice 元素不包含在exec cat中,除非我对其排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36943861/

10-16 10:19