私はGoプログラミング言語から演習1.4に取り組んでいます。プログラムは引数として与えられたstdinまたはファイルを読み込み、重複している行を出力します。構造体内のマップを使用する方がいいですか? Goプログラミング言語の演習1.4
私は作業コードを持っていますが、構造体内でマップを使用する方が良いかどうかは疑問です。今は一意の行が見つかったときに構造体に新しいマップが作成されています。しかし、それは不器用に思われ、私はこれに別の方法でアプローチする必要があるかどうかを知りたい。
type dupCount struct {
count int
fileCount map[string]int
}
func main() {
counts := make(map[string]dupCount)
files := os.Args[1:]
if len(files) == 0 {
countLines(os.Stdin, counts, "stdin")
} else {
for _, arg := range files {
f, err := os.Open(arg)
if err != nil {
fmt.Fprintf(os.Stderr, "dup2: %v\n", err)
continue
}
countLines(f, counts, arg)
f.Close()
}
}
func countLines(f *os.File, counts map[string]dupCount, filename string) {
input := bufio.NewScanner(f)
for input.Scan() {
var tmp = counts[input.Text()]
if tmp.count == 0 {
tmp.fileCount = make(map[string]int)
}
tmp.count++
tmp.fileCount[filename]++
counts[input.Text()] = tmp
}
}
私はマップas outlined in the Go Github repoの値に直接割り当てることができないことを回避するためにcountLinesでTMP変数を使用しています。
あなたがそれを使用する前に 'fileCount'マップを作成しなければならないので、それは私にとっては面倒ではないようです。ところで、 'counts'を' map [string] * dupCount'と宣言することで、これを少し簡単にすることができます。そうすれば、マップから値を読み取ってから最後に戻す必要はありません。ポインタを扱うので、フィールドを直接変更することができます。 –
@AndySchweig私はそれがより簡単になるかどうかはわかりません。その場合、ポインタがnilであるかどうかをチェックし、明示的に 'dupCount'を作成する必要があります。 –