Golang - 为什么字符串切片元素不包含在 exec cat 中,除非我对它进行排序

Golang - why is string slice element not included in exec cat unless I sort it

我在 golang 中遇到了一个有点奇怪的问题。本质上,我有一段代表文件路径的字符串。然后我 运行 一只猫针对这些文件路径在排序、重复数据删除等之前组合文件

这是代码部分(其中 'applicableReductions' 是字符串切片):

    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 附加到数组时,问题就来了。我有一个单独的函数,它从数据库内容创建一个新文件,然后将其添加到 applicableReductions 切片中。

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 附加到 applicableReduction 切片,它就在那里,但不会被 cat 调用。

澄清一下,当我将以下内容放在它说“损坏代码在这里”的位置时:

    if dbSource {
        err = r.RetrieveDomainsFromDB(collection, ToListName, filePath)
        if err != nil {
                return err
                continue
            }
      }

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

我想可能是文件写入有延迟,所以我尝试添加 time.wait,但没有用。但是我找到的解决方案是对切片进行排序,例如调用 exec cat 上面的这段代码解决了问题,但我不知道为什么:

sort.Strings(applicableReductions)

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

非常感谢 go-pro 的解释,如果您需要更多信息,请告诉我调试 - 很乐意理解

更新 有人建议这与这里的问题相同:Golang append an item to a slice,我想我理解那里的问题,我并不是说这不一样,但我看不到同样的事情发生 - 有问题的切片是没有从主函数外部触及(例如,没有在 RetrieveDomainsFromDB 函数中编辑切片),我在循环之前创建切片,在循环中附加到它,然后在循环之后使用它 - 我在顶部添加了一个示例来展示切片是如何构建的 - 如果是这种情况,请有人澄清这个切片被复制到哪里

更新并关闭 请关闭问题 - 该问题与字符串切片的使用无关。事实证明,我是在 bufio-writer 被刷新之前从最终输出文件中读取的(在函数结束之前 defer flush 在函数 return 开始之前)

我认为排序只是重新安排问题,所以我没有注意到它持续存在或可能需要一些时间让缓冲区刷新。现在通过手动调用 flush 对两种方式进行排序。

感谢您提供的所有帮助