当前位置: 首页 > 知识库问答 >
问题:

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

柯昆杰
2023-03-14

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

以下是代码部分(“ApplicatableReduces”是字符串片段):

    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内容创建一个新文件,然后将该文件添加到ApplicatableReduces切片。

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

为了澄清这一点,当我将下面的内容放在这里时,它说的是“坏代码”:

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

执行fmt时可以看到filepath。但在cat输出文件中看不到文件内容。

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

sort.Strings(applicableReductions)

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

如果你需要更多的信息,请告诉我,调试-很乐意帮忙理解

更新有人建议这是和这里一样的问题:戈兰将一个项目附加到一个切片上,我想我理解那里的问题,我不是说这是不一样的,但我看不到发生了同样的事情——有问题的切片是没有从主函数外部触及(例如,在RetrieveDomainsFromDB函数中没有编辑切片),我在循环之前创建切片,在循环中追加到它,然后在循环之后使用它-我在顶部添加了一个示例来展示如何切片已经构建-如果是这样,请有人澄清这个切片被复制到哪里


共有1个答案

裴曜灿
2023-03-14

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

我认为排序只是重新安排问题,所以我没有注意到它仍然存在,或者可能给缓冲区一些时间来刷新。无论哪种方式,现在都可以手动调用冲洗。

谢谢你提供的一切帮助

 类似资料:
  • 问题内容: 我想知道我什么时候做类似的事情 创建新字符串或返回视图/迭代器 问题答案: Python会进行逐个切片,这意味着每次切片时(非常琐碎的切片(例如)除外),它都会将所有数据复制到一个新的字符串对象中。 根据一位开发人员的说法,之所以做出此选择是因为 [按引用切片]方法更复杂,更难实现并且可能导致意外行为。 例如: 使用“按切片复制”设计,可以立即释放字符串。尽管您只对第一个字符感兴趣,但

  • 我正在使用这个命令从切片中删除一个元素,但它不起作用,请建议。

  • 问题内容: 我正在尝试对字符串列( 包含数字 )进行排序。 您会看到Mysql的自然排序算法放在后面( 对于大多数应用程序来说都可以 ),但是我有独特的需求,因此我希望结果应该像这样排序。 仅使用SQL 是否可能,或者我必须在应用程序级别操纵结果集? 问题答案: 继续 假设 它始终为WORD_space_NUMBER,这应该可行: 使用POSITION查找空间,使用SUBSTRING捕获其后的数字

  • 问题内容: 我想对具有nr的字符串进行排序。我怎么做? 可以说我的整数是 在主要我做class2.Sort(); 提前致谢。 问题答案:

  • 问题内容: 在Go中,如果我有一个字符串变量s: 我如何将其转换或拆分或爆炸为切片或字符串数​​组,以使其变为: 问题答案: 您应该使用该软件包。 http://play.golang.org/p/UKZbcuJUPP

  • 问题内容: 这个带有添加功能的删除技巧如何工作? 似乎它正在抓取第一个元素(空数组)之前的所有内容 然后将所有内容附加在第一个元素之后(位置零) …(点对点)有什么作用? 问题答案: 切片在哪里,是要删除的元素的索引: 是Go中可变参数的语法。 基本上,在 定义 函数时,它将把您传递的所有参数放入该类型的一个切片中。这样,您可以传递任意数量的参数(例如,可以传递任意数量的参数)。 现在,当 调用