Как делают меня “разность” несколько файлов против единственного основного файла?

Ваш канал не буферизован, поэтому первая отправка по нему будет блокироваться, пока кто-то не получит от него. Но код, который будет получать от него, идет после этого, так что это «немедленный» тупик.

Вы можете сделать его небуферизованным, как ch := make(chan int, 1), так что отправка не будет блокироваться, но тогда у вас есть одна процедура, которая имеет for range по каналу. Этот цикл завершается, только если канал закрывается, но вы никогда не закрываете его. И вы отправляете только одно значение, поэтому цикл блокируется, ожидая значений, которые он может получить, или канала, который будет закрыт.

Вам нужна другая программа, которая когда-нибудь закроет канал. И внутри цикла, вам не нужно снова получать от канала, конструкция цикла уже делает это. i будет значением, полученным из канала.

Рабочий пример, который имеет какой-либо смысл:

func func1(n int) {
    ch := make(chan int)
    go func() {
        for i := 0; i < 5; i++ {
            ch <- i
        }
        close(ch)
    }()
    for i := range ch {
        fmt.Println(i)
    }
}

Это выводит (попробуйте на Go Playground ):

0
1
2
3
4

17
задан Zoe 23 May 2019 в 18:59
поделиться

9 ответов

Для людей, которые все еще задаются вопросом, как это сделать, diffuse - самый близкий ответ, он выполняет N-образное слияние путем отображения всех файлов. и выполняем трехстороннее слияние между соседями.

10
ответ дан 30 November 2019 в 14:01
поделиться

Ни один из существующих инструментов сравнения / слияния не сделает то, что вы хотите. На основе вашего примера снимка экрана вы ищете алгоритм, который выполняет выравнивание по нескольким файлам и дает соответствующие веса на основе сходства линий.

Первая проблема - взвешивание выравнивания на основе сходства линий. Самые популярные алгоритмы выравнивания, в том числе те, которые используются GNU diff, TDiff и TrmDiff, выполняют выравнивание на основе хешей строк и просто проверяют, совпадают ли строки точно или нет. Вы можете предварительно обработать строки, чтобы удалить пробелы или изменить все на строчные, но это все. Добавить, удалить или изменить букву и выравнивание вещей, вся строка отличается. Любое выравнивание различных линий в этой точке является чисто случайным.

Beyond Compare учитывает сходство линий, но в действительности работает только для двусторонних сравнений. Сравните это! также имеет некоторый алгоритм подобия, но он также ограничен двухсторонним сравнением. Это может значительно замедлить сравнение, и я не знаю ни о каком другом компоненте или программе, коммерческом или с открытым исходным кодом, который даже пытается это сделать.

Другая проблема заключается в том, что вам также нужно сравнение с несколькими файлами. Это означает, что нужно либо запустить алгоритм двухстороннего сравнения несколько раз и сшить результаты вместе, либо найти алгоритм, который выполняет несколько выравниваний одновременно.

Сшивание будет трудным: ваш пример показывает, что в исходном файле могут отсутствовать строки, поэтому вам нужно сравнить каждый файл с каждым другим файлом, чтобы получить кучу выравниваний, а затем вы ' Мне нужно найти лучший способ, чтобы соответствовать этим выравниваниям. Наивный алгоритм сшивания довольно легко сделать, но он будет испорчен тривиальными совпадениями (например, пустыми строками).

Существуют исследовательские работы, в которых рассматривается выравнивание нескольких последовательностей одновременно, но обычно они сосредоточены на сравнении ДНК. вам определенно придется кодировать это самостоятельно. Википедия охватывает множество основ, тогда вам, вероятно, придется переключиться на Google Scholar.

4
ответ дан 30 November 2019 в 14:01
поделиться

Попробуйте Beyond Compare от Scooter Software . Он поддерживает трехстороннее объединение и написан на Delphi / Kylix для поддержки нескольких платформ. Я использовал его довольно широко (даже через VPN), и он хорошо работает.

1
ответ дан 30 November 2019 в 14:01
поделиться

для f в файле1 файл2 файл3 файл4 файл5; do echo "$ f \ n \ n" >> outF; diff $ f baseFile >> outF; echo "\ n \ n" >> outF; сделано

1
ответ дан 30 November 2019 в 14:01
поделиться

Diff3 должен помочь. Если вы работаете в Windows, вы можете использовать его из Cygwin или из diffutils .

1
ответ дан 30 November 2019 в 14:01
поделиться

Я создал свой собственный инструмент сравнения DirDiff , потому что я не хотел, чтобы детали, которые совпадали два раза на экране, и отличающиеся друг от друга детали для удобства сравнения. Вы можете использовать его в режиме каталога в каталоге с равным количеством копий базового файла. Он не отображает экспорт различий, но я перечислю его как запрос функции .

1
ответ дан 30 November 2019 в 14:01
поделиться

Возможно, вы захотите взглянуть на некоторые компоненты слияния, так как вы описываете именно то, что делают инструменты слияния между общей базой, файлом управления версиями и локальным файлом. За исключением того, что вы хотите более 2 файлов (+ база) ...
Просто мои $ 0,02

0
ответ дан 30 November 2019 в 14:01
поделиться

SourceGear Diffmerge хорош (и бесплатен) для различий файлов на основе окон.

0
ответ дан 30 November 2019 в 14:01
поделиться

Я знаю, что это старый поток, но vimdiff делает (почти) именно то, что вы ищете, с дополнительным преимуществом, заключающимся в возможности правильного редактирования файлов. с точки зрения различий.

0
ответ дан 30 November 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: