Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【Go ハンズオン】Windows / Linux コマンドを Go で再現

Avatar for uji uji
March 01, 2026
4

【Go ハンズオン】Windows / Linux コマンドを Go で再現

GDG on Campus Kyoto University & Kyoto.go 共催

Avatar for uji

uji

March 01, 2026
Tweet

More Decks by uji

Transcript

  1. 【Go ハンズオン】 Windows / Linux コマンドを Go で再現 2026 年3

    月7 日 GDG on Campus Kyoto University & Kyoto.go 共催 GDG on Campus Kyoto University & Kyoto.go
  2. 今日のゴール Go の開発環境を構築する Go で簡単なプログラムを書けるようになる OS コマンド( ls など)を Go

    で再実装してみる 自分で好きなコマンドを作ってみる 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 2
  3. 質問や感想は X: #kyotogo Discord: Kyoto.go のサーバーにある #2026-03-07-hands-on へ! 質問・相談は @3/7-mentor

    にお気軽に 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 3
  4. コミュニティ紹介 GDG on Campus Kyoto University GDG on Campus (GDGoC)

    は 学生同士の学びと専門的な能力開発の 架け橋となることを目指したコミュニティ その中でも京都大学の学生中心で構成される GDGoC Kyoto University は 京大生含む関西圏を中心としたエンジニア同士が交流し、情報交換し、 協力できるネットワークの形成を目的として創設されました。 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 6
  5. タイムテーブル 時間 内容 15:00 〜15:30 オープニング・自己紹介 15:30 〜16:30 Go 環境構築

    → Hello World → ls コマンド実装 16:30 〜17:50 自由課題(独自コマンド開発) 17:50 〜18:00 クロージング 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 7
  6. ハンズオン開始! AI (ChatGPT, Claude 等)は活用してOK ! ls コマンド実装の章では、写経をお勧めします! 「動いたからOK 」で終わらず、生成されたコードをしっかり読んで理解しよう

    学びや発見は Discord で積極的に共有しよう 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 9
  7. Go のインストール https://go.dev/doc/install の手順でインストールが確実 パッケージマネージャーを使っている人はそれを使うのも良し winget (Windows), brew (Mac), apt

    (Debian 系 Linux) など 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 11
  8. 動作確認 ターミナルを開いて: go version こんな出力が出れば OK : go version go1.26.0

    darwin/arm64 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 12
  9. そもそも Go って何?(今更?) Google が開発したオープンソースのプログラミング言語 シンプルな構文、高速なコンパイル、並行/ 並列処理が得意 単一バイナリにコンパイルができ、クロスコンパイルもサポート 配布やデプロイが容易 フォーマッターやLanguage

    Server などをはじめ、 開発に必要なツール群も公式がサポート 標準パッケージが超充実 Gopher 可愛い 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 13
  10. Go のバージョン管理について Go は後方互換性を重視 → 最新版だけ入っていれば古いコードも大体動く バージョン管理ツールは必要性が薄い 複数バージョンが必要な場合は以下で別バージョンをインストール可能: go install

    golang.org/dl/go1.10.7@latest go1.10.7 download 参考: https://go.dev/doc/manage-install 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 14
  11. プロジェクトの作成 好きな場所にディレクトリを作って、Go モジュールを初期化します。 mkdir kyoto cd kyoto go mod init

    kyoto go.mod ファイルが作られます: module kyoto go 1.25.0 // 1.26 の場合一つ前のバージョンになるはず(サポートバージョン) 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 17
  12. go.mod とは? Go のモジュール管理ファイル(Node.js の package.json に相当) モジュール名、Go バージョン、依存パッケージを管理 go

    mod init <モジュール名> で作成 サードパーティ製モジュールは go get xxx でインストール go.mod に自動追記される ( チェックサムを管理する go.sum も自動で作られる) 参考: https://go.dev/ref/mod 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 18
  13. main.go を書く main.go を作成: package main import "fmt" func main()

    { fmt.Println("Hello, World!") } 実行: go run main.go Hello, World! 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 19
  14. 基本構文のポイント package main — 実行可能プログラムのエントリーポイント import "fmt" — 標準ライブラリの読み込み func

    main() — プログラムの開始地点 package main // ← 実行ファイルは必ず main パッケージ import "fmt" // ← 使うパッケージを import func main() { // ← ここから実行が始まる fmt.Println("Hello, World!") } 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 20
  15. やること ls コマンドの基本機能を Go で再実装する # 本物の ls ls #

    => main.go go.mod # 自作の ls go run main.go # => main.go go.mod 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 22
  16. main.go を書き換える package main import ("fmt"; "os") func main() {

    entries, err := os.ReadDir(".") if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } for _, entry := range entries { fmt.Println(entry.Name()) } } 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 23
  17. ポイント解説 os.ReadDir(".") — カレントディレクトリのファイル一覧を取得 err — Go ではエラーを戻り値で返す(例外ではない) range —

    スライス(配列)をループで回す entry.Name() — ファイル名を取得 entries, err := os.ReadDir(".") // ディレクトリを読む if err != nil { // エラーチェック // ... } for _, entry := range entries { // 一覧をループ fmt.Println(entry.Name()) // ファイル名を表示 } 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 24
  18. 引数でディレクトリを指定できるようにする func main() { dir := "." if len(os.Args) >

    1 { dir = os.Args[1] } entries, err := os.ReadDir(dir) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } for _, entry := range entries { fmt.Println(entry.Name()) } } 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 25
  19. go run main.go /tmp 【Go ハンズオン】Windows / Linux コマンドを Go

    で再現 GDG on Campus Kyoto University & Kyoto.go 26
  20. バイナリをビルドする 普段書いている .go ファイルは人間が読めるテキスト(ソースコード) go build するとコンピュータが直接実行できる形式(バイナリ)に変換される 生成されたバイナリは Go がインストールされていない環境でもそのまま動く

    go build -o kyoto-ls main.go GOOS=windows GOARCH=amd64 go build -o kyoto-ls main.go // OS,CPUアーキテクチャの指定パターン ./kyoto-ls ./kyoto-ls /home ./kyoto-ls /tmp go build で単一バイナリが作られる — 依存なしでどこでも実行可能! 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 27
  21. flag パッケージでオプションを追加しよう ls に -a (隠しファイル表示)オプションを追加してみよう showAll := flag.Bool("a", false,

    "隠しファイルも表示する") flag.Parse() flag.Bool でフラグを定義 → flag.Parse() で解析 *showAll が true なら隠しファイルも表示 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 28
  22. flag パッケージでオプションを追加しよう(続き) for _, entry := range entries { if

    !*showAll && strings.HasPrefix(entry.Name(), ".") { continue } fmt.Println(entry.Name()) } go run main.go -a # 隠しファイルも表示 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 29
  23. 好きなコマンドを作ってみよう! いくつかアイデアを紹介します。簡単なものから挑戦してみてください。 コマンド 難易度 概要 echo ★☆☆ 引数をそのまま出力 cat ★☆☆

    ファイルの中身を表示 wc ★★☆ 行数・単語数・バイト数を数える head ★★☆ ファイルの先頭N 行を表示 grep ★★☆ パターンに一致する行を表示 tree ★★★ ディレクトリ構造をツリー表示 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 31
  24. よく使うパッケージ: os — ファイル操作、引数、環境変数 fmt — 出力フォーマット strings — 文字列操作

    bufio — バッファ付きI/O path/filepath — パス操作 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 32
  25. Go の構文がわからないときは? A Tour of Go を活用しよう! https://go.dev/tour/list Go の基本構文をブラウザ上で対話的に学べる公式チュートリアル

    変数、ループ、関数、構造体、インターフェースなど一通りカバー Go Playground で気軽に試せる! https://go.dev/play/ ブラウザだけで Go のコードを書いて即実行できる 環境構築不要、ちょっとした動作確認に便利 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 34
  26. go fix コマンド AI が生成するコードは古い API を使っていることがある go fix は古い

    API 呼び出しを新しい API に自動変換してくれるツール go fix ./... Go のバージョンアップで非推奨になった関数を自動で書き換え AI に書かせたコードをそのまま使う前に go fix を通すと安心 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 35
  27. 実装ヒント(1/2 ) os.Args — コマンドライン引数のスライス( [0] はプログラム名) os.ReadFile(path) — ファイルの中身を一括で

    []byte として読み込む os.Open(path) — ファイルを開いて *os.File を返す strings.Join(slice, sep) — 文字列スライスを区切り文字で結合 strings.Contains(s, substr) — 文字列に部分文字列が含まれるか判定 strings.Fields(s) — 空白区切りで文字列を分割(単語分割に便利) 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 36
  28. 実装ヒント(2/2 ) bufio.NewScanner(reader) — ファイルなどを1 行ずつ読み込むスキャナーを作成 filepath.WalkDir(root, fn) — ディレクトリを再帰的に走査する

    flag.Int("name", default, "説明") — コマンドオプション(整数)を定義 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 37
  29. コマンド別 おすすめの組み合わせ コマンド 組み合わせ echo os.Args + strings.Join cat os.ReadFile

    wc bufio.NewScanner + strings.Fields head bufio.NewScanner + flag grep bufio.NewScanner + strings.Contains tree filepath.WalkDir 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 38
  30. 参考リンク Go 公式チュートリアル: https://go.dev/tour/list Go 標準ライブラリ: https://pkg.go.dev/std Go Packages: https://pkg.go.dev

    困ったらメンターに気軽に聞いてください! 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 39
  31. 今日やったこと Go の環境を構築した Hello World を動かした ls コマンドを Go で再実装した

    自分で好きなコマンドを作ってみた Go のシンプルな構文と強力な標準ライブラリで OS コマンドが簡単に作れることを体験できたはず! 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 41
  32. 次のステップ A Tour of Go を一通りやってみる https://go.dev/tour/ フラグ処理を追加してみる( flag パッケージ)

    テストを書いてみる( go test ) 作ったコマンドを GitHub に公開してみる 【Go ハンズオン】Windows / Linux コマンドを Go で再現 GDG on Campus Kyoto University & Kyoto.go 42