これから始める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.
上田拓也
Go ビギナーズ
Go Conference
@tenntenn
Google Developer Expert (Go)
一般社団法人 Gophers Japan 代表理事
Experts Team
人類Gopher化計画
Gopher = Goエンジニア、Goのマスコットキャラクター
発表内容
Goとは
Goとは?
6
Goが開発された理由
7
Go1の後方互換
Goの開発プロセスとGo2
Goの開発プロセス
Goの特徴 − 強力でシンプルな言語設計と文法 −
10
Goに入ってはGoに従え
= 言語の思想を理解しよう
Goの特徴 − 並行プログラミング −
11
チャネル
ゴールーチン
A
ゴールーチン
B
データ
データ
// 関数fを別のゴールーチンで呼び出す
go f()
Goの特徴 − 豊富な標準ライブラリ −
12
fmt | 書式に関する処理など |
net/http | HTTPサーバなど |
archive, compress | zipやgzipなど |
encoding | JSON, XML, CSVなど |
html/template | HTMLテンプレート |
os, path/filepath | ファイル操作など |
Goの特徴 − 周辺ツールの充実 −
13
go build | ビルドを行うコマンド |
go test | xxxx_test.goに書かれたテストコードの実行 |
go doc, godoc | ドキュメント生成 |
gofmt, goimports | コードフォーマッター |
go vet | コードチェッカー |
gopls | Language Server Protocol (LSP) の実装 |
Goの特徴 − シングルバイナリ・クロスコンパイル −
14
# Windows(32ビット)向けにコンパイル
$ GOOS=windows GOARCH=386 go build
# Linux(64ビット)向けにコンパイル
$ GOOS=linux GOARCH=amd64 go build
※ go build はGoのソースコードをビルドするコマンド
Goが活用できる領域
Goの利用状況
16
Goで開発されている著名なOSS
Goを製品開発に利用している企業例
Goを学ぶ
公式のチュートリアルで学ぶ
チュートリアル | 説明 |
Hello, World | |
複数パートから成る一通りのモジュール作成の流れを学べる | |
RDBを使った基礎 | |
Ginを使ったRESTful APIの基礎 | |
Go1.18から入るジェネリスのチュートリアル | |
Go1.18から入るFuzzingのチュートリアル | |
文法の基礎などをインタラクティブに学ぶ |
A Tour of Go
21
Shizuoka.goによる解説
Play with Go
23
Go の最初の手順 by Microsoft
プログラミング言語Go完全入門
Gopher道場 自習室
Goのハンズオン
公式ドキュメントで学ぶ
書籍で学ぶ
New!!
各地のコミュニティで学ぶ
Sendai.go
Okinawa.go
Umeda.go
Fukuoka.go
Shizuoka.go
golang.tokyo
Women Who Go Tokyo
Okayama.go
など...
Women Who Go
Student Go
32
海外カンファレンスで学ぶ
33
インターンシップで学ぶ
開発環境の構築
開発に必要なもの
36
Gitのインストール
Goの開発環境のインストール
38
◯◯envは必要か?
# Go1.16.1をインストールする $ go install golang.org/dl/go1.16.1@latest $ go1.16.1 download |
GOPATHとGOROOTの設定は?
コンパイルと実行
$ go build main.go
$ go build .
$ go build pkgname
$ go run main.go
$ go run .
$ go run pkgname
よく使われるエディタとIDE
■ この他にもたくさんある
42
GoLand
43
Visual Studio Code(VS Code)
44
Go Modules
Go1.0以前の話
goinstallの登場
go getの登場で解決したこと
go getで解決できなかったこと
ベンダリング
$ tree .
main.go
vendor
└── github.com
└── mitchellh
└── cli
ビルドが解決できない例
D: 1.0
go get D
1. パッケージDのインストール
D: 1.0
go get C
C: 1.8
D≧1.4
2. パッケージCのインストール
D: 1.6
go get -u D
C: 1.8
D≧1.4
3. パッケージDの更新
古い
※CはDのバージョン1.4以上に依存
バグ
うまくビルドができない!
バージョン管理ツールの登場
Goコミュニティで標準なものが
必要になってきた
depの登場
depはgoツールに
直接導入されるものではなかった
そしてGo Modulesへ
Import Compatibility Rule
import "github.com/tenntenn/hoge"
import hoge "github.com/tenntenn/hoge/v2"
後方互換性が担保できない場合
Minimal Version Selection
モジュール
// My hello, world.��module "rsc.io/hello"��require (� "golang.org/x/text" v0.0.0-20180208041248-4e4a3210bb54� "rsc.io/quote" v1.5.2�)
モジュール名
依存しているモジュール
依存しているモジュールのバージョン
セマンティックバージョンニング
X.Y.Z
メジャーバージョン
マイナーバージョン
パッチバージョン
go modコマンド
go mod init go mod init モジュール名 | 指定したモジュール名でgo.modファイルを作成する モジュール名を省略するとGOPATHから推測する |
go mod tidy | 使用していないモジュールのgo.modからの削除 必要なモジュールのダウンロードとgo.modへの追加 |
go mod why | 指定したパッケージがなぜ必要になったか表示 |
go mod vendor | 依存するパッケージをvendor以下にコピーする |
go installでCLIツールのインストール
# gpのインストール
$ go install github.com/tenntenn/goplayground/cmd/gp@latest
まとめ