1. Goに触れる
@tenntenn
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
質問について
3
上田拓也
Go ビギナーズ
Go Conference
@tenntenn
Google Developer Expert (Go)
一般社団法人 Gophers Japan 代表理事
バックエンドエンジニアとして日々Goを書いている。Google Developer Expert (Go)。一般社団法人Gophers Japan代表。Go Conference主催者。大学時代にGoに出会い、それ以来のめり込む。人類をGopherにしたいと考え、Goの普及に取り組んでいる。複数社でGoに関する技術アドバイザーをしている。マスコットのGopherの絵を描くのも好き。
作者
【PR】企業向け研修や技術アドバイザー
1.1. Goとは?
7
Goとは?
8
Goが開発された理由
9
Goの開発サイクル
引用元:Go Release Cycle
Go1の後方互換
11
Goの開発プロセスとGo2
12
Goの開発プロセス
新しい機能をキャッチアップする
開発版を試す
# 開発版を試す $ go install golang.org/dl/gotip@latest $ gotip download |
Goの特徴 − 強力でシンプルな言語設計と文法 −
15
Goの特徴 − 並行プログラミング −
16
チャネル
ゴールーチン
A
ゴールーチン
B
データ
データ
// 関数fを別のゴールーチンで呼び出す
go f()
Goの特徴 − 豊富な標準ライブラリ −
17
fmt | 書式に関する処理など |
net/http | HTTPサーバなど |
archive, compress | zipやgzipなど |
encoding | JSON, XML, CSVなど |
html/template | HTMLテンプレート |
os, path/filepath | ファイル操作など |
Goの特徴 − 周辺ツールの充実 −
18
go build | ビルドを行うコマンド |
go test | xxxx_test.goに書かれたテストコードの実行 |
go doc, godoc | ドキュメント生成 |
gofmt, goimports | コードフォーマッター |
go vet | コードチェッカー |
gopls | Language Server Protocol (LSP) の実装 |
Goの特徴 − シングルバイナリ・クロスコンパイル −
19
# Windows(32ビット)向けにコンパイル
$ GOOS=windows GOARCH=386 go build
# Linux(64ビット)向けにコンパイル
$ GOOS=linux GOARCH=amd64 go build
※ go build はGoのソースコードをビルドするコマンド
Goに入ってはGoに従え
20
1.2. Goが利用できる領域
21
Goの利用状況
22
サーバサイドでの利用
23
サーバ
Android/iOS
クライアント
ブラウザなど
リクエスト
レスポンス
Webページなど
Go
JS、HTML、CSS
Java、Swift
gRPCとGo
24
Goで開発されている著名なOSS
25
Goを製品開発に利用している企業例
26
コマンドラインツールでの利用
27
flag | コマンドライン引数 |
os, path/filepath | ファイル操作など |
strings | テキスト処理 |
encoding | JSON, XML, CSVなど |
Goで書かれたCLIツール
28
その他の活用事例と注意点
29
組み込みやIoTでの利用
30
TinyGo
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
GopherJSでフロントエンド開発
33
※できるというだけで、主流な開発手法なわけではありません
WASMによるフロントエンド開発
34
Go Mobileでモバイルアプリ開発
35
※できるというだけで、主流な開発手法なわけではありません
Ebitengine™
36
1.3. Goを学ぶには
37
怪しい情報に注意しよう
38
公式のチュートリアルで学ぶ
チュートリアル | 説明 |
Hello, World | |
複数パートから成る一通りのモジュール作成の流れを学べる | |
RDBを使った基礎 | |
Ginを使ったRESTful APIの基礎 | |
Go1.18から入るジェネリスのチュートリアル | |
Go1.18から入るFuzzingのチュートリアル | |
文法の基礎などをインタラクティブに学ぶ |
A Tour of Go
40
Shizuoka.goによる解説
41
Play with Go
42
※2025年3月現在、更新が止まっています
Go の最初の手順 by Microsoft
43
プログラミング言語Go完全入門
44
Gopher道場 自習室
45
Goのハンズオン
46
公式ドキュメントで学ぶ
書籍で学ぶ
New!!
New!!
New!!
各地のコミュニティで学ぶ
Sendai.go
Okinawa.go
Umeda.go
Fukuoka.go
Shizuoka.go
golang.tokyo
Women Who Go Tokyo
Okayama.go
など...
地域の技術コミュニティの重要性
Women Who Go
51
カンファレンスで学ぶ
52
海外カンファレンスで学ぶ
53
tenntennのGoについての活動
54
1.4. Hello, World
55
The Go Playground
56
サードパーティパッケージも使える
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
$ 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
package main
import "fmt"
/*
-- hogera --
*/
func main() {
fmt.Println("Hello, playground")
}
同時編集用できるPlayground
60
コマンドラインから操作する
61
# 実行
$ gp run main.go
# フォーマット
$ gp format [-imports] main.go
# シェアURLの生成
$ gp share main.go
ダウンロード
$ gp download https://go.dev/play/p/sTkdodLtokQ
gpは複数ファイルに対応している
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
Goのソースコードファイルの構成
63
package main
func main() {
println("Hello, 世界")
}
パッケージの定義
main関数の定義
画面に表示する組み込み関数
「Hello,世界」という文字列
コメント
64
package main
func main() {
// println("表示されない")
println("表示される")
/*
ブロックコメントは
行をまたいでも大丈夫
*/
}
行コメント://から行末まで
ブロックコメント:/*から*/まで
プログラムが実行されるまでの流れ
65
Goの
コード
機械語
コーディング
コンパイル
実行
ここを一緒にやるのがインタプリタ(スクリプト言語)
プログラムに問題がある場合
66
Goの
コード
コーディング
コンパイル
コンパイル
エラー
↑問題のあるコード
問題を修正する
プログラムはどこから実行されるのか
67
初期化処理※
mainパッケージ
func main() {
// ...
}
※ パッケージ変数の初期化やinit関数の実行(後述)
プログラムとライブラリ
package a1
package a2
module a
package b1
package b2
module b
依存(利用)
インポート
Goのプログラムの構成とパッケージ
69
mainパッケージ
main モジュール
package a1
module a
インポート
package a2
標準ライブラリ
io
fmt
パッケージの種類
70
パッケージのインポート
71
標準ライブラリのパッケージ
72
fmt | 書式に関する処理など |
net/http | Webサーバなど |
archive, compress | zipやgzipなどの圧縮形式 |
encoding | JSON, XML, CSVなどのファイル形式 |
html/template | Web用のHTMLを生成するための機能 |
os, path/filepath | ファイル操作など |
標準ライブラリの使い方
73
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
fmtパッケージのインポート
fmtパッケージのPrintln関数を呼び出す
パッケージドキュメントを読もう
74
インポートパスとパッケージ名
package main
import "path/filepath"
func main() {
// (略)
filepath.Ext("hoge.txt") // ".txt"
// (略)
}
インポートパス
パッケージ名
fmt.Print関数/fmt.Println関数
76
package main
import "fmt"
func main() {
fmt.Print("Hello, ") // 改行されない
fmt.Println("世界") // 改行される
fmt.Println("A", 100, true, 1.5) // スペース区切りで表示される
}
fmt.Printf関数
77
package main
import "fmt"
func main() {
fmt.Printf("Hello, 世界\n") // \nで改行する
fmt.Printf("%d-%s", 100, "偶数") // %dは整数、%sは文字列
}
fmt.Scanln関数
78
package main
import "fmt"
func main() {
var price int
fmt.Print("値段>")
fmt.Scanln(&price)
fmt.Printf("%d円\n", price)
}
&をつけると変数がある場所を表す
1.5. 開発環境の構築
79
開発に必要なもの
80
Gitとは?
用語 | 意味 |
リポジトリ | バージョン管理(履歴の管理)を行う単位 |
ブランチ | 変更の履歴を分岐して管理するもの |
コミット | 自分の変更を確定させてブランチに反映すること。または、変更を反映させた特定のソースコードの状態 |
タグ | 特定のコミットに名前をつけたもの |
プッシュ | リモートリポジトリにローカルのブランチの変更を送ること |
プル | リモートリポジトリの状態をローカルのブランチに取り込むこと |
マージ | あるブランチを別のブランチに統合(マージ)すること |
Gitのインストール
82
Goの開発環境のインストール
83
Goのインストール方法を学ぶ
84
ターミナル(ターミナルエミュレータ)
本資料におけるコマンド実行の説明
$ echo hello hello |
Goで開発の始め方
87
$ go mod init modulepath |
コンパイルと実行
88
$ go build main.go
$ go build .
$ go build modulepath
$ go run main.go
$ go run .
$ go run modulepath
Go自体のバージョン管理
89
特定のバージョンのGoをインストール
# Go1.24.0をインストールする $ go install golang.org/dl/go1.24.0@latest $ go1.24.0 download |
GOPATHとGOROOTの設定は?
よく使われるエディタとIDE
92
GoLand
93
GoLandでHello, World
94
GoLandでHello, World
95
Visual Studio Code(VS Code)
96
Visual Studio CodeでGoを書く
97
Visual Studio CodeでHello, World
98
Visual Studio Codeで補完を有効に
99
Visual Studio CodeでHello, World
100
1.6. 開発支援ツール
101
コードの書式を揃える
102
コードの品質を保つ
103
go vet | バグといえるレベルの誤りを検出 |
golint | Goらしくないコードを検出(非推奨) |
errcheck | エラー処理のミスを検出 |
staticcheck | サードパーティ製の静的解析ツールのセット |
GolangCI-Lint | サードパーティ製のLinter Runner |
gosec | セキュリティチェック |
go vet
104
package main
import "fmt"
func main() {
fmt.Printf("%s\n", 100)
}
%sなのに数値が渡されている
PRレビューで静的解析ツールを使用
105
リファクタリング
106
デバッグ
107
学習と生成AI
108