我在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/