如果您没有太多行数,您可能可以检索所有行并将它们存储在一个切片中。然后,您可以通过实现sort.Interface并调用sort.Sort函数对 RAM 中的这些条目进行排序。如果您需要一个示例,请查看sort.IntSlice的来源。
棘手的部分可能是定义字母数字排序顺序。我不知道它的确切定义(而且我无法在这么短的时间内查找它),但无论如何我都尝试过实现它。以下是您可能用于 less 方法的代码:
package main
import "log"
func less(a, b string) bool {
i, j := 0, 0
for i < len(a) && j < len(b) {
numeric, numA, numB := false, 0, 0
for i < len(a) && a[i] >= '0' && a[i] <= '9' {
numA = numA*10 + int(a[i]) - '0'
numeric = true
i++
}
for j < len(b) && b[j] >= '0' && b[j] <= '9' {
numB = numB*10 + int(b[j]) - '0'
numeric = true
j++
}
if numeric {
if numA != numB {
return numA < numB
}
continue
}
if a[i] != b[j] {
return a[i] < b[j]
}
i++
j++
}
return i == len(a) && j != len(b)
}
var tests = []struct {
a, b string
r1, r2 bool
}{
{"bar", "foo", true, false},
{"foo100", "foo10", false, true},
{"foo100a", "foo100b", true, false},
{"foo", "foo", false, false},
{"100", "100", false, false},
{"foo5", "foo12", true, false},
{"foo5", "fo3", true, false},
{"foo", "foo8", true, false},
}
func main() {
for i := range tests {
if less(tests[i].a, tests[i].b) != tests[i].r1 {
log.Fatalf("test %d failed", i)
}
if less(tests[i].b, tests[i].a) != tests[i].r2 {
log.Fatalf("reverse test %d failed", i)
}
}
}
我不确定代码是否足以满足您的需求,或者您是否需要处理更复杂的情况,但它至少可以为您自己的修改提供一个良好的起点。