gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:23:16 24 4
gpt4 key购买 nike

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

这是代码部分(其中“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 附加到数组时,问题就来了。我有一个单独的函数,它从数据库内容创建一个新文件,然后将其添加到 applicableReductions 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 附加到 applicableReduction slice ,它就在那里,但不会被 cat 调用。

澄清一下,当我把下面的内容放在它说的地方时:BROKE CODE GOES HERE:

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

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

我想可能是写入文件的延迟,所以我尝试添加一个时间。等待,这没有帮助。然而,我找到的解决方案是对 slice 进行排序,例如调用 exec cat 上面的这段代码解决了问题,但我不知道为什么:

sort.Strings(applicableReductions)

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

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

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

最佳答案

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

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

感谢您提供的所有帮助

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com