1 of 109

1. Goに触れる

The Go gopher was designed by Renée French.

The gopher stickers was made by Takuya Ueda.

Licensed under the Creative Commons 3.0 Attributions license.

2 of 109

注意事項と免責事項

  • 利用は個人の学習の範囲内でお願いします
    • この資料は個人の学習を目的とした利用に限ります
    • この資料を使った講義等を行う場合は事前に@tenntennに�許可を得てください
    • 生成AIを用いたサービスに学習させ、それを配布する行為を禁じます
  • 免責事項
    • この資料を元に発生した問題、この資料を参考にして作成した�ソフトウェア等に基づく問題について作成者は責任を負いません

2

3 of 109

質問について

  • Gophers Slackの#japanチャンネルでお願いします
    • Slackへの招待URL: https://invite.slack.golangbridge.org/
    • @tenntennまでメンションをください
    • ※質問への回答はすぐに行われるわけではないので予めご了承ください

3

4 of 109

上田拓也

Go ビギナーズ

Go Conference

Google Developer Expert (Go)

一般社団法人 Gophers Japan 代表理事

バックエンドエンジニアとして日々Goを書いている。Google Developer Expert (Go)。一般社団法人Gophers Japan代表。Go Conference主催者。大学時代にGoに出会い、それ以来のめり込む。人類をGopherにしたいと考え、Goの普及に取り組んでいる。複数社でGoに関する技術アドバイザーをしている。マスコットのGopherの絵を描くのも好き。

作者

5 of 109

【PR】企業向け研修や技術アドバイザー

  • Goに関する研修・講義
    • 初学者から中級者以上向けの講義を行えます
    • プログラミング言語Go完全入門をベースにカスタマイズ可能です
  • 技術アドバイザー
    • PRのレビュー
    • 週1回1時間程度のMeetやZoomでの相談
  • 依頼方法
    • フォームからお問い合わせください
    • 短期・長期のどちらでも契約が可能です
    • 講義・ハンズオン、技術相談などを組み合わせることも可能です
    • 実績等はhttps://tenntenn.dev/ja/job/をご覧ください

6 of 109

目次

  1. Goとは
  2. Goが利用できる領域
  3. Goを学ぶには
  4. Hello, World
  5. 開発環境の構築
  6. 開発支援ツール

6

7 of 109

1.1. Goとは?

7

8 of 109

Goとは?

  • Googleが開発したプログラミング言語
    • 2009年11月に最初のバージョンをオープンソースで公開
      • 2012年3月に正式バージョンであるGo1.0を公開
      • 2025年2月現在の最新バージョンはGo1.24
      • 半年毎のペースでバージョンアップ(参考
    • Robert Griesemer、Rob Pike、Ken Thompsonによって設計された
  • 特徴
    • 強力でシンプルな言語設計と文法
    • 並行プログラミング
    • 豊富な標準ライブラリ群
    • 周辺ツールの充実
    • シングルバイナリ・クロスコンパイル

8

9 of 109

Goが開発された理由

  • Google内の課題を解決するために開発された
    • 開発のスケール
      • 1つの超巨大なコードベース(C++、Java、Python)
      • ビルドするだけで時間がかかる → 分散ビルド(後のBazel)
        • 依存関係の解決(4.2MBのソースコード → 8GB以上のデータの読み込み)
      • ビルドが速い言語
        • 依存関係の解決に無駄がない
        • ビルドが遅くなる要因を排除(使用していないimport宣言を許さないなど)
      • ツールが作りやすい言語
        • 標準で静的解析をサポート/ソースコードだけで解析が可能
    • 製品のスケール
      • 超大規模はシステムを稼働させている
      • マルチコア時代のシステム言語
        • 並行処理とガベージコレクタを同時に採用

9

参考

10 of 109

Goの開発サイクル

  • Goは毎年8月と2月にリリースされる
    • マイナーバージョンがアップされる
    • リリース3ヶ月前からDevelopment Freezeになる
      • バグ修正とドキュメント修正以外は基本的に行われない
    • リリース2ヶ月前からRC版がリリースされる

引用元:Go Release Cycle

11 of 109

Go1の後方互換

  • Go1の間は言語の後方互換が保たれる
    • https://go.dev/doc/go1compat
    • 言語仕様に破壊的変更が加わらない
    • 一部例外はある
      • セキュリティ、重大なバグなど
    • Go1.0で書いたコードはGo1.24でもビルドできる
      • 場合によってはgo fixgo fmtを掛ける必要がある
    • Go1を対象に執筆された書籍やブログは言語仕様に関しては�互換が保たれているためGo1.xの間は有効である
      • ランタイムやgo toolに関しては変更される可能性あり

11

12 of 109

Goの開発プロセスとGo2

  • Goの開発プロセス
    • 実際にGoを使った中で問題を見つける
    • 解決策をコミュニティに提案し議論する
    • 実装して評価する
    • 問題なければリリースされる
  • Go2とは?
    • https://go.dev/blog/toward-go2
    • 明確なターゲットがあるわけではない
    • Go1.xとして開発されていき、Go1の後方互換が�保てなくなるような変更を加える必要になったら�Go2としてリリースされる
    • 例えば、必ずしもジェネリクスがGo2でリリースされるわけではない
      • ジェネリクスはGo1.18でリリースされた

12

Goの開発プロセス

13 of 109

新しい機能をキャッチアップする

  • プロポーザル/ドラフトデザインを見つける
    • go.dev/design
    • GitHubでlabel:Proposalでissueを検索する
      • go.dev/issue?q=label:Proposal
      • ドラフトデザイン(まだ正式なプロポーザルではない)の場合もある
    • プロポーザルのレビューMTGの結果を見る
      • go.dev/s/proposal-minutes
  • 新しい機能を学ぶ
    • GoチームがYouTubeで解説している場合がある
      • by Russ Cox
      • by Michael Matloob
    • ソースコードを読む

14 of 109

開発版を試す

  • gotipコマンドを用いる
    • Goは標準で特定のバージョンをインストールできる(参考
    • 使用方法はgoコマンドと同じ(例:gotip build main.go
  • The Go Playgroundを用いる
    • https://go.dev/play/
    • 3つのバージョンが選べる
      • 現在
      • 1つ前
      • 開発版

# 開発版を試す

$ go install golang.org/dl/gotip@latest

$ gotip download

15 of 109

Goの特徴 − 強力でシンプルな言語設計と文法 −

  • 読みやすい & 書きやすい
    • 複雑な記述をしにくい(愚直に書く)
    • 冗長な記述が不要(型推論など)
  • 曖昧さの排除
    • 曖昧な記述はできない
  • 考えられたシンプルさ
    • 各言語機能のベクトルが直交している
    • 機能を増やすことで言語を拡張していくことはしない

15

16 of 109

Goの特徴 − 並行プログラミング −

  • ゴールーチン
    • 軽量なスレッドに近いもの
    • goキーワードをつけて関数呼び出し
  • チャネル
    • ゴールーチン間のデータのやり取り
    • 安全にデータをやり取りできる

16

チャネル

ゴールーチン

A

ゴールーチン

B

データ

データ

// 関数fを別のゴールーチンで呼び出す

go f()

17 of 109

Goの特徴 − 豊富な標準ライブラリ −

  • 標準ライブラリ一覧

 https://pkg.go.dev/std

17

fmt

書式に関する処理など

net/http

HTTPサーバなど

archive, compress

zipやgzipなど

encoding

JSON, XML, CSVなど

html/template

HTMLテンプレート

os, path/filepath

ファイル操作など

18 of 109

Goの特徴 − 周辺ツールの充実 −

  • go toolとして標準/準標準で提供
  • サードパーティ製のツールも充実
  • IDEによらない独立したツールとして提供

18

go build

ビルドを行うコマンド

go test

xxxx_test.goに書かれたテストコードの実行

go doc, godoc

ドキュメント生成

gofmt, goimports

コードフォーマッター

go vet

コードチェッカー

gopls

Language Server Protocol (LSP) の実装

19 of 109

Goの特徴シングルバイナリ・クロスコンパイル −

  • シングルバイナリになる
    • コンパイルするとデフォルトでは単一の実行可能ファイルになる
    • 動作環境を特別に用意しなくてもよい
  • クロスコンパイルできる
    • 開発環境とは違うOSやアーキテクチャ向けのバイナリが作れる
    • 環境変数のGOOSGOARCHを指定する

 

19

# Windows(32ビット)向けにコンパイル

$ GOOS=windows GOARCH=386 go build

# Linux(64ビット)向けにコンパイル

$ GOOS=linux GOARCH=amd64 go build

go build はGoのソースコードをビルドするコマンド

20 of 109

Goに入ってはGoに従え

  • 言語だけではなく文化も学ぶ
    • https://gihyo.jp/news/report/01/GoCon2014Autumn/0002
    • ≠ Goに慣習に従いなさい
    • どの言語を学ぶ際にも必要な考え方
      • 自然言語でも同じ
    • なぜGoが開発されたのかを知ること
    • 1つ1つの言語機能には開発された背景がある
      • 例)なぜ使ってないパッケージのimport宣言はエラーになる?
        • コンパイル(ビルド)が遅くなる
        • → 開発がスケールしなくなる
      • Simplicity is Complicated by Rob Pike

20

21 of 109

1.2. Goが利用できる領域

21

22 of 109

Goの利用状況

  • Go開発者のサーベイ(アンケート調査)
    • 年に2回行われる
    • Goチームが実施
  • VS Codeプラグイン経由でも実施
    • 無作為にサーベイを実施
  • API、CLI、Web、DevOpsなどに利用
    • 毎年傾向は変わらず

22

23 of 109

サーバサイドでの利用

23

サーバ

Android/iOS

クライアント

ブラウザなど

リクエスト

レスポンス

Webページなど

Go

JS、HTML、CSS

Java、Swift

24 of 109

gRPCとGo

  • Googleが開発したRPCのプロトコル
    • デフォルトではProtocol Buffersを用いる
    • HTTP/2を利用して通信
    • さまざまな言語で利用が可能
    • Goでは google.golang.org/grpc を用いる

24

25 of 109

Goで開発されている著名なOSS

  • クラウド関連のOSSが多い
    • Docker
    • Kubernetes
    • gVisor

25

26 of 109

Goを製品開発に利用している企業例

  • 海外
    • PayPal
    • American Express
    • セールスフォース
    • Netflix
    • Uber
    • Dropbox
  • 日本
    • newmo
    • メルカリ・メルペイ
    • サイバーエージェント
    • アンドパッド

26

27 of 109

コマンドラインツールでの利用

  • 環境に依存しない
    • シングルバイナリになるので依存するものがない
    • クロスコンパイルができるので他のOS向けにコンパイルできる
  • 標準パッケージが豊富
    • コマンドラインツールを作るために必要な機能が標準で存在

27

flag

コマンドライン引数

os, path/filepath

ファイル操作など

strings

テキスト処理

encoding

JSON, XML, CSVなど

28 of 109

Goで書かれたCLIツール

  • peco
    • fuzzy finder
    • https://github.com/peco/peco
  • ghq
    • リポジトリ管理ツール
    • https://github.com/x-motemen/ghq
  • Hugo
    • 静的サイトジェネレータ
    • https://gohugo.io/
  • GitHub CLI
    • GitHub公式のコマンドラインツール
    • https://github.com/cli/cli

28

29 of 109

その他の活用事例と注意点

  • このスライド以降の活用領域は主要なものではありません
    • プログラミングスクールや転職サイトなどの入門記事では、モバイルアプリやIoTでの利用がさも主要な活用領域だと書かれていることがありますが、そのような事実はありません
    • あくまでこういう事にも使えるよというレベルのものです
    • 怪しい情報は参考にしないようにしましょう
  • この資料を参考に記事を書かれる方へ
    • 企業の名前で公開された技術系の記事はクォリティが低いとマイナスの印象を与えます
    • 自社のブランディングの為には、有識者(現役のエンジニア)に監修を依頼しましょう
    • tenntennへの依頼もウェルカムです

29

30 of 109

組み込みやIoTでの利用

  • 組み込み向けの開発が楽
    • クロスコンパイルができる
      • ARMなどアーキテクチャ用にビルドできる
    • ランタイムがあるのでバイナリサイズが大きくなる問題もある
  • GOBOTの利用
    • https://gobot.io
    • さまざまなデバイス向けのライブラリを集めたもの
      • ドローン、Arduino、Intel Edison、Raspberry Pi など

30

31 of 109

TinyGo

  • 組み込み向けのGoのサブセット
    • LLVMを用いている
    • バイナリが小さい
    • LLVMがWASMに対応したのでWASMもサポート

31

package main

import "machine"

import "time"

func main() {

led := machine.LED

machine.LED.Configure(machine.PinConfig{Mode: machine.PinOutput})

for {

led.Low()

time.Sleep(time.Millisecond * 1000)

led.High()

time.Sleep(time.Millisecond * 1000)

}

}

32 of 109

スマートホーム

  • Nature Remo APIを使って家電を操作

32

33 of 109

GopherJSでフロントエンド開発

  • GoからJavaScriptを生成するツール群
    • ゴールーチンとチャネルに対応
    • ほとんどの標準パッケージに対応
    • Node.JSでも動く
    • Java(Nashorn)でも動く
    • Playgroundもある

33

※できるというだけで、主流な開発手法なわけではありません

34 of 109

WASMによるフロントエンド開発

  • WebAssembly
    • ブラウザ上で実行できるバイナリ形式の言語
    • ネイティブに近いパフォーマンスで動作する
    • C/C++などをコンパイルする
  • Goの対応状況
    • Go1.11で実験的に対応
    • クロスコンパイルできる
  • JavaScriptのAPIを呼ぶ
    • syscall/jsパッケージを使う
  • コンパイラディレクティブ
    • //go:wasmimportと//go:wasmexportがある
      • WASMの機能をGoで使ったり、その逆ができる(参照

34

35 of 109

Go Mobileでモバイルアプリ開発

  • Goでモバイルアプリを作るツール群
    • iOS / Androidに対応
    • golang.org/x/mobile
  • 2通りのスタイル
    • Nativeアプリ
      • Goだけで書く
    • SDKアプリ
      • Goで書いたライブラリを呼び出す
    • 参考:https://go.dev/wiki/Mobile

35

※できるというだけで、主流な開発手法なわけではありません

36 of 109

Ebitengine™

  • Go製の2Dゲームライブラリ
    • https://ebitengine.org/
    • マルチプラットフォーム

36

37 of 109

1.3. Goを学ぶには

37

38 of 109

怪しい情報に注意しよう

  • 無署名な記事は参考にしない
    • 責任をとる人がいませんし、正しい知識があるかも分かりません
    • 無署名な記事は内容が怪しいものが多いです
  • 1次情報を確認する
    • この資料を2次情報には含め私見の入ってることを意識する
    • 事実は必ず公式(go.dev)を確認すること
    • 日本語で記載された公式のドキュメントはありません
  • 記事が多い=主流な開発手法ではない
    • 日本語で記事を見かけるからといって主流なものとは限りません
    • 例:Goではクリーンアーキテクチャが主流
      • 日本での採用事例は良く見かけますが、全世界ではそうでもありません

38

39 of 109

公式のチュートリアルで学ぶ

  • 豊富なチュートリアル群
    • https://go.dev/doc/tutorial/

チュートリアル

説明

Hello, World

複数パートから成る一通りのモジュール作成の流れを学べる

RDBを使った基礎

Ginを使ったRESTful APIの基礎

Go1.18から入るジェネリスのチュートリアル

Go1.18から入るFuzzingのチュートリアル

文法の基礎などをインタラクティブに学ぶ

40 of 109

A Tour of Go

  • ブラウザ上で実行できるチュートリアル
    • https://go.dev/tour

40

41 of 109

Shizuoka.goによる解説

  • A Tour of Goを動画で解説

41

42 of 109

Play with Go

  • Web上でハンズオンを行う事ができる
    • https://play-with-go.dev/

42

※2025年3月現在、更新が止まっています

43 of 109

Go の最初の手順 by Microsoft

  • Microsoftが提供するGoのチュートリアル
    • https://docs.microsoft.com/ja-jp/learn/paths/go-first-steps/
    • Go の使用を開始する
    • Go でのパッケージ、変数、関数の使用方法を理解する
    • Go で制御フローを使用する
    • Go のデータ型、構造体、配列、スライス、マップを使用する
    • Go でのエラー処理とログ記録を実装する
    • Go でメソッドとインターフェイスを使用する
    • Go でプログラムを作成してテストする

43

44 of 109

プログラミング言語Go完全入門

44

  1. Goに触れる
  2. 基本構文
  3. 関数と型
  4. パッケージ
  5. コマンドラインツール
  6. 抽象化
  7. エラー処理
  8. テストとテスタビリティ
  9. ゴールーチンとチャネル
  10. HTTPサーバとクライアント
  11. データベース
  1. テキスト処理
  2. リフレクション
  3. 静的解析とコード生成
  4. ジェネリクス(型パラメタ)

45 of 109

Gopher道場 自習室

  • Gopher道場の動画資料を誰でも閲覧できる
    • https://gopherdojo.org/studyroom
    • Gopher道場 Slackで参加者同士コミュニケーションが取れる

45

46 of 109

Goのハンズオン

  • 作って学ぶGo 〜 Goのおもちゃ箱 〜
    • 法政大学の集中講義で用いられている資料
  • ガチャを作ろう
    • 法政大学の集中講義で用いられていた資料
  • 家計簿アプリを作ろう
    • コマンドラインツールからWebアプリ作成までを体験できる
  • 分かるゴールーチンとチャネル
    • トレーシングをしながら並行処理を学ぶ
  • テストを書こう
    • テストの書き方やテクニックを学ぶ
  • ゲストブックを作ろう
    • Google App Engineを使ったWebアプリ作成を学ぶ
  • コマンドラインツールを作ろう
    • 画像変換を行うコマンドラインツールを作る

46

47 of 109

公式ドキュメントで学ぶ

  • 公式ドキュメント
    • いろいろあるので目を通すと良い
  • 言語仕様
    • コンパクトな言語仕様なので簡単に読める
  • Go Code Review Comments (日本語訳)
    • Goらしい書き方が学べる
  • Effective Go
    • Code Review Commentsより詳しい内容(内容が古くなっている)
  • パッケージドキュメント
    • ドキュメントをしっかり読む
  • 公式ブログ
    • 最新の情報が記載される

48 of 109

書籍で学ぶ

New!!

New!!

New!!

49 of 109

各地のコミュニティで学ぶ

Sendai.go

Okinawa.go

Umeda.go

Fukuoka.go

Shizuoka.go

golang.tokyo

Women Who Go Tokyo

Okayama.go

など...

50 of 109

地域の技術コミュニティの重要性

  • あつまりやすさ
    • 住んでいるところなので参加しやすい
    • オフラインなので話すハードルが低い
    • 一方的になりづらい
  • カンファレンスへの発展
    • 仙台・関西(大阪/京都)・福岡で開催
    • 一般社団法人Gophers Japanが支援
      • 配信ツールや各種ツール
      • ノウハウの提供

51 of 109

Women Who Go

  • 女性とジェンダーマイノリティのGoコミュニティ
    • https://womenwhogotokyo.github.io/
    • 月に1回くらい集まって勉強会をしている
    • Goの入門講座やもくもく会などをやっている
    • Go Conferenceでは初学者向けのハンズオンを担当

51

52 of 109

カンファレンスで学ぶ

  • Go Conference
    • https://gocon.jp/
    • 世界でもっとも歴史のあるGoのカンファレンス
    • 2013年から10年以上続く

52

53 of 109

海外カンファレンスで学ぶ

  • GopherCon
    • https://www.gophercon.com/
    • 世界最大のGoのカンファレンス
    • 世界各地から1800人以上のGoのエンジニアがあつまる
    • スピーカーは渡航費等が無料になる
      • Gophers Slackの#cfp-jaでチャレンジしましょう
  • その他のカンファレンス

53

54 of 109

tenntennのGoについての活動

  • さまざまな活動を行っています
  • YouTuberやってます
    • https://tenn.in/youtube
    • 勉強会のセッション動画をアップしてます
  • 登壇資料もアップしてます
    • https://tenn.in/slides

54

55 of 109

1.4. Hello, World

55

56 of 109

The Go Playground

  • Web上でGoを実行できるサイト
    • コードのシェアなども行える

56

57 of 109

サードパーティパッケージも使える

  • 標準パッケージ以外も利用できる
    • ライブラリのREADMEに貼れるので便利

57

package main

import "github.com/k0kubun/pp"

func main() {

pp.ColoringEnabled = false

pp.Print(struct {

N int

S string

}{

N: 100,

S: "hoge",

})

}

58 of 109

複数ファイルも使える

  • txtar(テキストアーカイブ)形式で記述する
    • ファイルを-- ファイルパス -- 区切った形式
    • ディレクトリを含んでいてもよい

58

$ tree .

.

├── fuga

│ └── fuga.go

├── go.mod

└── main.go

-- go.mod --

module hogera

go 1.12

-- fuga/fuga.go --

package fuga

func Fuga() string { return "Fuga" }

-- main.go --

package main

import "fmt"

import "hogera/fuga"

func main() {

fmt.Println(fuga.Fuga())

}

59 of 109

うまくいかない例

  • コメントの中に--で始まる行を含む場合
    • --でファイルが区切られてしまう

59

package main

import "fmt"

/*

-- hogera --

*/

func main() {

fmt.Println("Hello, playground")

}

60 of 109

同時編集用できるPlayground

  • ルームごとに同時に編集が行える

60

61 of 109

コマンドラインから操作する

  • github.com/tenntenn/goplayground
    • The Go PlaygroundのAPI クライアント
    • gpというコマンドも付属している
      • -backendというオプションで開発版で動作させる

61

# 実行

$ gp run main.go

# フォーマット

$ gp format [-imports] main.go

# シェアURLの生成

$ gp share main.go

ダウンロード

$ gp download https://go.dev/play/p/sTkdodLtokQ

62 of 109

gp複数ファイルに対応している

  • ファイルリストに複数ファイルが取れる
    • findコマンドなどを使えばディレクトリを含む場合にも対応できる

62

# 実行

$ gp run a.go b.go

# フォーマット

$ gp fomrat [-imports] a.go b.go

# シェアURLの生成

$ gp share a.b b.go

$ find . -not -path '*/\.*' -type f | xargs gp share

# ダウンロード

$ gp download -dldir=output https://go.dev/play/p/Ccn7TxELuAT

63 of 109

Goのソースコードファイルの構成

63

package main

func main() {

println("Hello, 世界")

}

パッケージの定義

main関数の定義

画面に表示する組み込み関数

Hello,世界」という文字列

64 of 109

コメント

  • プログラムに対する注釈を書く機能
    • 実行されない人間に対する注釈
    • コンパイル時にすべて消される(コンピュータには不要)
    • What(何を)ではなくWhy(なぜ)を書く

64

package main

func main() {

// println("表示されない")

println("表示される")

/*

ブロックコメントは

行をまたいでも大丈夫

*/

}

行コメント://から行末まで

ブロックコメント:/*から*/まで

65 of 109

プログラムが実行されるまでの流れ

65

Goの

コード

機械語

コーディング

コンパイル

実行

ここを一緒にやるのがインタプリタ(スクリプト言語)

66 of 109

プログラムに問題がある場合

  • コンパイルエラーになる
    • Goのコンパイラがエラーを出力する
    • エラーを読んで問題を修正する
    • エラーは英語で表示されるがちゃんと読むことが大切
    • コンパイルでは検出できない実行時エラーもある

66

Goの

コード

コーディング

コンパイル

コンパイル

エラー

↑問題のあるコード

問題を修正する

67 of 109

プログラムはどこから実行されるのか

  • mainパッケージmain関数
    • 自動で実行される関数(=処理をまとめたもの)
    • 初期化がおわったら必ず実行される
    • ここからプログラムを読むと処理が追いやすい

67

初期化処理

mainパッケージ

func main() {

// ...

}

※ パッケージ変数の初期化やinit関数の実行(後述)

68 of 109

プログラムとライブラリ

  • ライブラリの力を借りる
    • すべてゼロから作ることはあまりしない
    • 信頼されたライブラリを用いる
      • ライブラリは外部利用されることを目的としたプログラム
  • ライブラリはモジュール単位で管理される
    • モジュールは複数のパッケージから成る
    • プログラムから利用するにはパッケージごとに用いる(インポート)

package a1

package a2

module a

package b1

package b2

module b

依存(利用)

インポート

69 of 109

Goのプログラムの構成とパッケージ

  • mainパッケージから別のパッケージをインポートする
    • パッケージをインポートすることで様々な機能が使えるようになる

69

mainパッケージ

main モジュール

package a1

module a

インポート

package a2

標準ライブラリ

io

fmt

70 of 109

パッケージの種類

  • mainパッケージ
    • main関数の存在するパッケージ
    • プログラムの起点(エントリポイント)となるパッケージ
    • 実行可能なGoのプログラムの場合には必ず存在する
  • 標準パッケージ
    • Goが最初から用意しているパッケージ
    • 100以上のパッケージが存在する
  • サードパーティパッケージ
    • 第3者(自分も含む)が開発したパッケージ
    • インターネット上で公開されていることが多い
    • インストールすることで使える
    • ライブラリとも呼ばれる

70

71 of 109

パッケージのインポート

  • 他のパッケージの機能を使う
    • インポートという機能を使うことで実現
  • パッケージをインポートしてできること
    • 別のパッケージで用意された機能を使用できる
      • 型、変数、関数、定数など

71

72 of 109

標準ライブラリのパッケージ

  • 標準ライブラリのパッケージ一覧
    • https://pkg.go.dev/std

72

fmt

書式に関する処理など

net/http

Webサーバなど

archive, compress

zipやgzipなどの圧縮形式

encoding

JSON, XML, CSVなどのファイル形式

html/template

Web用のHTMLを生成するための機能

os, path/filepath

ファイル操作など

73 of 109

標準ライブラリの使い方

73

package main

import "fmt"

func main() {

fmt.Println("Hello, 世界")

}

fmtパッケージのインポート

fmtパッケージのPrintln関数を呼び出す

74 of 109

パッケージドキュメントを読もう

  • パッケージドキュメント
    • 公式で用意されている標準ライブラリのドキュメント
    • 例:https://pkg.go.dev/fmt#Println

74

75 of 109

インポートパスとパッケージ名

  • インポートパス
    • インポート宣言の際に用いられるスラッシュ区切りのパス
    • パッケージを一意に特定できる
  • パッケージ名
    • パッケージを利用する際に使用する名前

package main

import "path/filepath"

func main() {

// (略)

filepath.Ext("hoge.txt") // ".txt"

// (略)

}

インポートパス

パッケージ名

76 of 109

fmt.Print関数/fmt.Println関数

  • fmt.Print関数/fmt.Println関数
    • 標準出力(後述)に出力を行う関数
    • fmt.Printlnの方は末尾に改行をつけて表示する
    • 複数の値を渡せる

76

package main

import "fmt"

func main() {

fmt.Print("Hello, ") // 改行されない

fmt.Println("世界") // 改行される

fmt.Println("A", 100, true, 1.5) // スペース区切りで表示される

}

77 of 109

fmt.Printf関数

  • fmt.Printf関数
    • 書式(フォーマット)を指定して標準出力に出力を行う関数
    • 改行はされないので\n(改行文字)で改行する
    • %d%sで値の書式を指定して埋め込む

77

package main

import "fmt"

func main() {

fmt.Printf("Hello, 世界\n") // \nで改行する

fmt.Printf("%d-%s", 100, "偶数") // %dは整数、%sは文字列

}

78 of 109

fmt.Scanln関数

  • fmt.Scanln関数
    • 渡した変数がある場所に入力したデータを入れる関数
    • 変数がある場所(ポインタ)については後述

78

package main

import "fmt"

func main() {

var price int

fmt.Print("値段>")

fmt.Scanln(&price)

fmt.Printf("%d円\n", price)

}

&をつけると変数がある場所を表す

79 of 109

1.5. 開発環境の構築

79

80 of 109

開発に必要なもの

  • Goのツールチェイン(開発環境)
    • Goのソースコードを機械語に翻訳するためのコンパイラなど
    • 標準パッケージや開発に便利なツール類も含まれる
  • エディタ・統合開発環境(IDE)
    • Goのソースコードを編集するために必要
    • 好みによって好きなエディタやIDEを選ぶ
  • Git
    • ソースコードのバージョン管理ツール
    • ビルド(コンパイル)等で使われる場合がある
  • ターミナル/コマンドプロンプト
    • コマンドを実行するために使用
    • Windowsの場合はWSLを使うのがおすすめ

80

81 of 109

Gitとは?

  • 分散型バージョン管理システム
    • 各利用者が自分のPC(ローカル)にリポジトリのコピーを持つ
    • リモートのリポジトリに自分の変更をPushする

用語

意味

リポジトリ

バージョン管理(履歴の管理)を行う単位

ブランチ

変更の履歴を分岐して管理するもの

コミット

自分の変更を確定させてブランチに反映すること。または、変更を反映させた特定のソースコードの状態

タグ

特定のコミットに名前をつけたもの

プッシュ

リモートリポジトリにローカルのブランチの変更を送ること

プル

リモートリポジトリの状態をローカルのブランチに取り込むこと

マージ

あるブランチを別のブランチに統合(マージ)すること

82 of 109

Gitのインストール

  • macOS
    • ターミナルでgitと打てばインストールが開始される
    • brew install git でもインストールできる
  • Windows

82

83 of 109

Goの開発環境のインストール

  • 公式サイトからダウンロード

83

84 of 109

Goのインストール方法を学ぶ

  • 動画でGoのインストール方法を解説
    • https://youtu.be/lu3_OqhLCmw
    • macOS版

84

85 of 109

ターミナル(ターミナルエミュレータ)

  • コマンドを実行するためのソフトウェア
    • OSに同封されていることが多い
      • macOSの場合はアプリケーション>ユーティリティ>ターミナル
      • Windowsの場合はWindows Terminalなど
    • macOSではiTermが用いられる場合も多い

86 of 109

本資料におけるコマンド実行の説明

  • 入力を促すプロンプトも一緒に記述している
    • プロンプトとして$を用いることが多い
    • プロンプトをつけると入力したものとコマンドの出力が分かりやすい
    • 手元のターミナルにコピペする場合はプロンプトを除外する
      • 下の例の場合は「echo hello」をコピペする
      • 必須ではないが手入力だとコマンドを覚えやすい(個人差あり)

$ echo hello

hello

87 of 109

Goで開発の始め方

  • すで存在するプロジェクトやOSSの場合
    • 対象のGitリポジトリなどを手元にクローンする(DLする)
    • 開発用のマシン(PC)に1.21以上のGoが入っていればそのまま開発できる
      • ターミナルでgo versionコマンドで確認ができる
  • 新しく開発を始める場合
    • go mod initコマンドでgo.modを作成する
      • modulepathの部分はgithub.com/tenntenn/testtimeのように書く
      • ソースコードを管理している場所を特定できる形にする
        • GitHubリポジトリのパスにするのが無難
    • バージョンはgo mod edit -go 1.24.0 のようにコマンドで変更可

87

$ go mod init modulepath

88 of 109

コンパイルと実行

  • go buildコマンド
    • コンパイルして実行可能ファイル(バイナリ)を生成
  • go runコマンド
    • コンパイルから実行まで行う

88

$ go build main.go

$ go build .

$ go build modulepath

$ go run main.go

$ go run .

$ go run modulepath

89 of 109

Go自体のバージョン管理

  • go.mod(およびgo.work)ファイルが主体
    • goディレクティブに記載したバージョンより高くないとビルドができない
    • 低い場合でかつGo1.21以上の場合は自動で新しいバージョンのツールチェインがダウンロードされる
    • そのため、go.modの記載を変えるだけでも十分
  • 開発マシン全体のGoのバージョン
    • Go1.21以上であればあまり積極的にあげなくても良い
    • go mod initコマンドを実行する場合、バージョンが低くて困るケースもある
      • GOTOOLCHAIN=go1.24.0 go mod init example.com/sample のように実行するとバージョンが指定できる
    • goenvなどのサードパーティツールは使わない

89

90 of 109

特定のバージョンのGoをインストール

  • 複数のバージョンが共存できる

# Go1.24.0をインストールする

$ go install golang.org/dl/go1.24.0@latest

$ go1.24.0 download

91 of 109

GOPATHとGOROOTの設定は?

  • 特に理由がなければ不要
    • GOPATHはデフォルト値がある
    • GOROOTはgoコマンドが知っている
    • Go Modulesを使う前提なのでGOPATHのことは忘れても良い
      • なくなった訳ではないけど意識しなくてよい
    • 環境変数はgo envコマンドで取得できる
      • 環境変数として設定されていないものはデフォルト値
  • 古い情報を参考にしないようにしよう
    • Go1.11からGo Modulesが利用されるようになりました
    • それ以前の情報はあまり参考にしないようにしよう
    • 公式ドキュメントを翻訳サービスで翻訳しながら読むのがオススメ

92 of 109

よく使われるエディタとIDE

92

93 of 109

GoLand

  • JetBrains製のGoのIDE
    • https://www.jetbrains.com/go/
    • 多くのGopherが使っている
    • 補完が高速
    • インタフェース実装へのジャンプ
    • リファクタリング機能
    • デバッガ
    • 有料
    • 条件付きの無料プランもある
      • 学生は無料!

93

94 of 109

GoLandでHello, World

  • 新しいプロジェクトの作成
    • File > New > Project
    • プロジェクト名を「helloworld」にする
  • 新しいファイルを作成
    • プロジェクトにGoファイルを追加
    • File > New > Go File
    • ファイル名を「helloworld.go」にする
    • プログラムを入力する
  • 実行
    • Run > Run… > helloworld.go
    • 次からはツールバーにある「▶」ボタンを押せばよい

94

95 of 109

GoLandでHello, World

95

96 of 109

Visual Studio Code(VS Code)

  • マイクロソフトが開発しているエディタ
    • Windows、Linux、macOSで動く
    • 無料で使える
    • .goファイルを開こうとするとGo拡張をインストールするか聞く
    • Go拡張はGoの公式プロジェクト
    • Live Shareが便利
    • vscode.devではプラグインが動かない

96

97 of 109

Visual Studio CodeでGoを書く

  • 動画でVisual Studio CodeでGoを書く方法を説明
    • https://youtu.be/bHC5Z9BeIKs
    • Visual Studio Codeのインストール
    • Go拡張のインストール
    • 実行

97

98 of 109

Visual Studio CodeでHello, World

  • 新しいファイルを作成
    • File > New File
    • プログラムを入力する
  • 保存
    • File > Save
  • 実行
    • Debug > Run Without Debuging

98

99 of 109

Visual Studio Codeで補完を有効に

  • 設定を開く(macOSは⌘+,)
    • 設定の検索で「gopls」と検索
    • 「Go: Use Language Server」をONにする

99

100 of 109

Visual Studio CodeでHello, World

100

101 of 109

1.6. 開発支援ツール

101

102 of 109

コードの書式を揃える

  • gofmt
    • 読み方:ごーふむと
    • 標準のフォーマッタ
    • 絶対に使う
    • -s オプションで冗長な書き方をシンプルにできる
  • goimports
    • import宣言を追加/削除してくれる
    • 未使用パッケージのimportはコンパイルエラーなので必須
    • フォーマットもかける
    • -s オプションがない

102

103 of 109

コードの品質を保つ

  • 静的解析ツール

103

go vet

バグといえるレベルの誤りを検出

golint

Goらしくないコードを検出(非推奨)

errcheck

エラー処理のミスを検出

staticcheck

サードパーティ製の静的解析ツールのセット

GolangCI-Lint

サードパーティ製のLinter Runner

gosec

セキュリティチェック

104 of 109

go vet

  • コンパイラでは発見できないバグを見つける
    • go testを走らせれば自動で実行される(Go1.10から)
    • The Go Playgroundでも実行される

104

package main

import "fmt"

func main() {

fmt.Printf("%s\n", 100)

}

%sなのに数値が渡されている

105 of 109

PRレビューで静的解析ツールを使用

  • reviewdog
    • https://github.com/reviewdog/reviewdog
    • レビュー時に自動で静的解析ツールを実行する
    • 機械的にチェックできることは機械にやらせる
    • 人間だと忘れたり、心苦しかったしてチェックが漏れる
    • 設定ファイルを書けばreviewdogが勝手にPRにコメントをくれる

105

106 of 109

リファクタリング

  • eg
  • gopatch
    • https://github.com/uber-go/gopatch
    • パッチ形式で差分を当てられるツール
  • ast-grep
    • https://github.com/ast-grep/ast-grep
    • プログラミング言語によらない静的解析ツールが作れる(リファクタリングにも使える)
    • 内部ではgoパッケージではなくtree-sitterを使っている

106

107 of 109

デバッグ

  • Delve
    • https://github.com/derekparker/delve
    • Go専用のデバッガでよく使われる
    • ゴルーチンやチャネルにも対応
  • panicデバッグ
    • panicを使ってデバッグ
    • スタックトレースが出るので便利

107

108 of 109

学習と生成AI

  • 生成AIは開発の現場では当たり前に使われています
    • GitHub Copilot、Cursorなど
    • 生成AIが生成するコードの責任は自分自身です
    • 生成されたコードを理解するようにしましょう
  • 補完や生成AIができること ≠ 自分の能力
    • 自分ができることは何かを意識して学習しましょう
    • 他者に説明ができる知識が自分の知識です

108

109 of 109

109