Goでコマンドラインツールを作ってみた

Go

コマンドラインツールを作るのは難しそうなイメージがありましたが、案外簡単に作れてしまいました。

コード

main.go

package main

import (
	"bufio"
	"flag"
	"fmt"
	"os"
	"strings"
)

func main() {
	// コマンドライン引数の定義
	filename := flag.String("f", "", "検索対象のファイル名")
	word := flag.String("w", "", "検索する単語")
	flag.Parse()

	// 引数のバリデーション
	if *filename == "" || *word == "" {
		fmt.Println("使用方法: -f <ファイル名> -w <検索単語>")
		flag.PrintDefaults()
		os.Exit(1)
	}

	// ファイルを開く
	file, err := os.Open(*filename)
	if err != nil {
		fmt.Printf("ファイルを開けませんでした: %v\n", err)
		os.Exit(1)
	}
	defer file.Close()

	// 単語の出現回数をカウント
	scanner := bufio.NewScanner(file)
	count := 0
	for scanner.Scan() {
		count += strings.Count(strings.ToLower(scanner.Text()), strings.ToLower(*word))
	}

	if err := scanner.Err(); err != nil {
		fmt.Printf("ファイル読み込み中にエラーが発生しました: %v\n", err)
		os.Exit(1)
	}

	// 結果を表示
	fmt.Printf("ファイル '%s' 内の '%s' の出現回数: %d\n", *filename, *word, count)
}

サンプルファイル

test.txtとして保存します。

word
wordword
word&word
wrodword

動かしてみる

go run main.go -f test.txt -w word

ファイル 'test.txt' 内の 'word' の出現回数: 6

引数が正しくない場合

コマンドラインの使用方法やオプションの説明が表示されます。

go run main.go
                  
使用方法: program -f <ファイル名> -w <検索単語>
  -f string
        検索対象のファイル名
  -w string
        検索する単語
exit status 1