2017-03-06 8 views
2

私は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変数を使用しています。

+1

あなたがそれを使用する前に 'fileCount'マップを作成しなければならないので、それは私にとっては面倒ではないようです。ところで、 'counts'を' map [string] * dupCount'と宣言することで、これを少し簡単にすることができます。そうすれば、マップから値を読み取ってから最後に戻す必要はありません。ポインタを扱うので、フィールドを直接変更することができます。 –

+0

@AndySchweig私はそれがより簡単になるかどうかはわかりません。その場合、ポインタがnilであるかどうかをチェックし、明示的に 'dupCount'を作成する必要があります。 –

答えて

0

私はそれが特に厄介であるとは思わないが、私は値でdupCountをとるaddDupeヘルパー関数のいくつかの並べ替えを行うために誘惑されるかもしれない、行を追加するために必要とされるあらゆる変更になり、値

dupCountを返します。
func addDupe(dupes dupCount, filename string) dupCount { 
    if dupes.count == 0 { 
     dupes.fileCount = make(map[string]int) 
    } 
    dupes.fileCount[filename]++ 
    dupes.count++ 
    return dupes 
} 

これは、標準のappendがスライスのために機能するのと同様です。その後countLinesは次のように記述することができます。

func countLines(r io.Reader, counts map[string]dupCount, filename string) { 
    input := bufio.NewScanner(r) 
    for input.Scan() { 
     line := input.Text() 
     counts[line] = addDupe(counts[line], filename) 
    } 
} 

しかし、私が行っているすべてはあなたのtmp関数のパラメータに置き換えています。

関連する問題