diff-match-patch便利ですよね?
これで行単位のdiffを出そうと思ったんですが、APIのリストとにらめっこしてもわからなかったのですが、検索したら大本のGoogle謹製の方のWikiにあったので、実装のメモです。
import "github.com/sergi/go-diff/diffmatchpatch"
func lineDiff(src1, src2 string) []diffmatchpatch.Diff {
dmp := diffmatchpatch.New()
a, b, c := dmp.DiffLinesToChars(src1, src2)
diffs := dmp.DiffMain(a, b, false)
result := dmp.DiffCharsToLines(diffs, c)
fmt.Println(result)
return result
}
仮に、以下のテキストがあったとします。
abc
def
ghi
abc
go-
ghi
これのDiffをとると
{0 abc\n}
{-1 def\n}
{1 go-\n}
{0 ghi}
こんな感じのdiffになります。-1が削除(コード中はdiffmatchpatch.DiffDelete
を使ってね)、1が追加(diffmatchpatch.DiffInsert
)、0が変更なし(diffmatchpatch.DiffEqual
)で、各行の改行文字は各ブロックの末尾についてます。