開発環境
- macOS Mojave - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Go (プログラミング言語)
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES) (Alan A.A. Donovan(著)、Brian W. Kernighan(著)、柴田 芳樹(翻訳)、丸善出版)の第1章(チュートリアル)、1.3(重複した行を見つける)、練習問題1.4の解答を求めてみる。
コード
package main import ( "bufio" "fmt" "os" ) func main() { counts := make(map[string]int) filenames := make(map[string]string) files := os.Args[1:] if len(files) == 0 { countLines(os.Stdin, counts, "os.Stdin", filenames) } 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, filenames) f.Close() } } for line, n := range counts { if n > 1 { fmt.Printf("%d\t%s\n", n, line) fmt.Printf("files: %s\n", filenames[line]) } } } func countLines(f *os.File, counts map[string]int, filename string, filenames map[string]string) { input := bufio.NewScanner(f) for input.Scan() { text := input.Text() counts[text]++ filenames[text] += filename + " " } }
入出力結果(Terminal, cmd(コマンドプロンプト))
$ go run sample4.go < sample4.go 2 } files: os.Stdin os.Stdin 3 } files: os.Stdin os.Stdin os.Stdin 2 } files: os.Stdin os.Stdin 3 files: os.Stdin os.Stdin os.Stdin $ go build -o dup2 sample4.go $ ./dup2 sample4.go 2 } files: sample4.go sample4.go 3 files: sample4.go sample4.go sample4.go 3 } files: sample4.go sample4.go sample4.go 2 } files: sample4.go sample4.go $ ./dup2 sample1.go sample2.go sample3.go sample4.go 2 "strings" files: sample1.go sample3.go 5 } files: sample1.go sample2.go sample3.go sample4.go sample4.go 2 } files: sample4.go sample4.go 4 ) files: sample1.go sample2.go sample3.go sample4.go 4 "os" files: sample1.go sample2.go sample3.go sample4.go 4 "fmt" files: sample1.go sample2.go sample3.go sample4.go 4 func main() { files: sample1.go sample2.go sample3.go sample4.go 4 package main files: sample1.go sample2.go sample3.go sample4.go 5 } files: sample2.go sample3.go sample4.go sample4.go sample4.go 4 import ( files: sample1.go sample2.go sample3.go sample4.go 11 files: sample1.go sample1.go sample2.go sample2.go sample3.go sample3.go sample3.go sample3.go sample4.go sample4.go sample4.go $ ./dup2 sample4.go sample4.go 2 for line, n := range counts { files: sample4.go sample4.go 2 if n > 1 { files: sample4.go sample4.go 2 fmt.Printf("%d\t%s\n", n, line) files: sample4.go sample4.go 2 for input.Scan() { files: sample4.go sample4.go 2 import ( files: sample4.go sample4.go 2 "fmt" files: sample4.go sample4.go 2 if err != nil { files: sample4.go sample4.go 2 "bufio" files: sample4.go sample4.go 2 countLines(f, counts, arg, filenames) files: sample4.go sample4.go 6 } files: sample4.go sample4.go sample4.go sample4.go sample4.go sample4.go 2 fmt.Printf("files: %s\n", filenames[line]) files: sample4.go sample4.go 2 func countLines(f *os.File, counts map[string]int, filename string, filenames map[string]string) { files: sample4.go sample4.go 2 } else { files: sample4.go sample4.go 2 continue files: sample4.go sample4.go 2 } files: sample4.go sample4.go 2 f.Close() files: sample4.go sample4.go 4 } files: sample4.go sample4.go sample4.go sample4.go 4 } files: sample4.go sample4.go sample4.go sample4.go 2 func main() { files: sample4.go sample4.go 2 counts := make(map[string]int) files: sample4.go sample4.go 2 files := os.Args[1:] files: sample4.go sample4.go 2 for _, arg := range files { files: sample4.go sample4.go 2 package main files: sample4.go sample4.go 2 "os" files: sample4.go sample4.go 2 if len(files) == 0 { files: sample4.go sample4.go 2 input := bufio.NewScanner(f) files: sample4.go sample4.go 2 text := input.Text() files: sample4.go sample4.go 2 filenames[text] += filename + " " files: sample4.go sample4.go 2 fmt.Fprintf(os.Stderr, "dup2: %v\n", err) files: sample4.go sample4.go 6 files: sample4.go sample4.go sample4.go sample4.go sample4.go sample4.go 2 ) files: sample4.go sample4.go 2 filenames := make(map[string]string) files: sample4.go sample4.go 2 countLines(os.Stdin, counts, "os.Stdin", filenames) files: sample4.go sample4.go 2 f, err := os.Open(arg) files: sample4.go sample4.go 2 counts[text]++ files: sample4.go sample4.go $
0 コメント:
コメントを投稿