1 of 61

これから始めるGo

tenntenn Conference 2022

2022年01月15日(土)

資料:https://tenn.in/conn22-keynote

動画:https://tenn.in/conn22-keynote-video

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 61

上田拓也

Go ビギナーズ

Go Conference

@tenntenn

tenntenn.dev

Google Developer Expert (Go)

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

Experts Team

3 of 61

人類Gopher化計画

Gopher = Goエンジニア、Goのマスコットキャラクター

4 of 61

発表内容

  • 2022年にGoを始める人向けの最新情報
    • 最新版の開発環境構築方法
    • 重要なドキュメントや記事
    • よく勘違いされやすい古い情報
  • すでにGoを学習している人向けの情報
    • 公式サイトや公式ドキュメント情報の整理
    • Go Modulesなど何となく理解している情報の整理

5 of 61

Goとは

6 of 61

Goとは?

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

6

7 of 61

Goが開発された理由

  • Google内の課題を解決するために開発された
    • 開発速度の低下
      • 超巨大なコードベース
      • 複雑な依存関係
    • マルチコア時代のシステム言語
      • 並行処理とガベージコレクタを同時に採用
    • 軽量プログラミング言語(LL, Light weight Language)の盛り上がり
      • 静的型付け言語だとコンパイル時にエラーが発見できる
      • 動的型付け言語だと書きやすい
      • いいところ取りの書きやすい静的型付け言語がない
    • 静的解析がしやすい言語
      • 言語設計のレベルで静的解析しやすい言語を目指した

7

8 of 61

Go1の後方互換

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

9 of 61

Goの開発プロセスとGo2

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

Goの開発プロセス

10 of 61

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

  • スクリプト言語の書きやすさ
    • 冗長な記述は必要ない
  • 型のある言語の厳密さ
    • 曖昧な記述はできない
  • 考えられたシンプルさ
    • 機能を増やすことで言語を拡張していくことはしない

10

Goに入ってはGoに従え

= 言語の思想を理解しよう

11 of 61

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

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

11

チャネル

ゴールーチン

A

ゴールーチン

B

データ

データ

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

go f()

12 of 61

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

  • 標準ライブラリ一覧

 https://golang.org/pkg/

12

fmt

書式に関する処理など

net/http

HTTPサーバなど

archive, compress

zipやgzipなど

encoding

JSON, XML, CSVなど

html/template

HTMLテンプレート

os, path/filepath

ファイル操作など

13 of 61

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

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

13

go build

ビルドを行うコマンド

go test

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

go doc, godoc

ドキュメント生成

gofmt, goimports

コードフォーマッター

go vet

コードチェッカー

gopls

Language Server Protocol (LSP) の実装

14 of 61

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

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

 

14

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

$ GOOS=windows GOARCH=386 go build

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

$ GOOS=linux GOARCH=amd64 go build

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

15 of 61

Goが活用できる領域

16 of 61

Goの利用状況

  • 76%が職場でGoを使用
    • 66%がGoは会社の成功に不可欠
  • 76%が5ヶ月でバージョンアップしてる
  • 主にAPI、CLI、Web、DevOpsなどに利用
    • 2019年と傾向は変わらず

16

17 of 61

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

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

18 of 61

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

  • 海外
    • PayPal
    • American Express
    • セールスフォース
    • Netflix
    • Uber
    • Twitter
    • Dropbox
  • 日本
    • メルカリ・メルペイ
    • サイバーエージェント
    • DeNA
    • エウレカ
    • グノシー

19 of 61

Goを学ぶ

20 of 61

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

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

チュートリアル

説明

Hello, World

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

RDBを使った基礎

Ginを使ったRESTful APIの基礎

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

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

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

21 of 61

A Tour of Go

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

21

22 of 61

Shizuoka.goによる解説

  • A Tour of Goを動画で解説

23 of 61

Play with Go

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

23

24 of 61

Go の最初の手順 by Microsoft

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

25 of 61

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

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

26 of 61

Gopher道場 自習室

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

27 of 61

Goのハンズオン

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

28 of 61

公式ドキュメントで学ぶ

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

29 of 61

書籍で学ぶ

New!!

30 of 61

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

Sendai.go

Okinawa.go

Umeda.go

Fukuoka.go

Shizuoka.go

golang.tokyo

Women Who Go Tokyo

Okayama.go

など...

31 of 61

Women Who Go

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

32 of 61

Student Go

  • 学生のGoコミュニティ
    • Slackでやりとりしている
      • 招待フォーム
    • 学生同士のやりとり
    • 各社のGoエンジニアへのGoの質問

32

33 of 61

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

  • GopherCon
    • https://www.gophercon.com/
    • 世界最大のGoのカンファレンス
    • 世界各地から2000人以上のGoのエンジニアがあつまる
    • スピーカーは渡航費等が無料になる
  • その他のカンファレンス

33

34 of 61

インターンシップで学ぶ

  • Go1.18が学べる短期インターシップ(5日間)

35 of 61

開発環境の構築

36 of 61

開発に必要なもの

  • Goのツールチェイン(開発環境)
    • Goのソースコードを機械語に翻訳するためのコンパイラなど
    • 標準パッケージや開発に便利なツール類も含まれる
  • エディタ・統合開発環境(IDE)
    • Goのソースコードを編集するために必要
    • 好みによって好きなエディタやIDEを選ぶ
  • Git
    • ソースコードのバージョン管理ツール
    • go toolの中で使われている

36

37 of 61

Gitのインストール

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

38 of 61

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

  • 公式サイトからダウンロード
    • インストーラーなどで簡単にインストールできる

38

39 of 61

◯◯envは必要か?

  • 複数のバージョンが共存できる
    • 公式の方法だから謎のバグに悩まなくていい
    • 環境変数のPATHを通すだけで十分

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

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

$ go1.16.1 download

40 of 61

GOPATHとGOROOTの設定は?

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

41 of 61

コンパイルと実行

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

$ go build main.go

$ go build .

$ go build pkgname

$ go run main.go

$ go run .

$ go run pkgname

42 of 61

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

■ この他にもたくさんある

42

43 of 61

GoLand

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

43

44 of 61

Visual Studio Code(VS Code)

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

44

45 of 61

Go Modules

46 of 61

Go1.0以前の話

  • Makefileを使っていた
    • 6g(コンパイラ)や6l(リンカ)を使ってビルド
    • サンプルのMakefileが付いていてそれを利用していた
    • 依存関係はMakefileの中にかかれていた
    • gobuildというラッパーも存在していた

47 of 61

goinstallの登場

  • 2010年2月に登場
  • GitHubやBitbucketからダウンロードして配置する
  • Makefileほどの柔軟性はないが利便性が向上
  • インポートパスのルールの確立
    • ソースコードの中にすべての依存関係が記述される
    • go vetなどの静的解析ツールが簡単につくれるようになった
  • 2012年2月のGo1.0リリースでgo get

48 of 61

go getの登場で解決したこと

  • 簡単にビルドができるようになった
  • 作ったものを簡単に公開・再利用できるようになった
    • 現在のGoのコミュニティを形成する上で重要なファクター
    • go getすることで簡単に他の人が作ったパッケージを利用できる
  • ビルドシステムを意識しなくてよい
    • 6g6lなどを気にしなくてよい
    • 依存関係の解決方法などは勝手にやってくれる

49 of 61

go getで解決できなかったこと

  • バージョン付けとAPIの安定性
    • バージョン付けができない
    • アップデートによって何が変わるのかユーザに提示できない
    • gopkg.inなどの登場
  • ベンダリングとビルドの再現可能性
    • ビルドの再現性がとれない
    • 取得時に常に最新を見てしまうこと
    • godep、glide、GBなどの登場
    • ベンダリングの対応(Go1.5以上)

50 of 61

ベンダリング

  • ライブラリのベンダリング
    • vendor以下に置くとimportで優先される
    • バージョン指定はできない

$ tree .

main.go

vendor

└── github.com

└── mitchellh

└── cli

51 of 61

ビルドが解決できない例

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以上に依存

バグ

うまくビルドができない!

52 of 61

バージョン管理ツールの登場

  • サードパーティ製のツール類が登場し始める
    • GB
      • https://getgb.io/
      • プロジェクトベースのビルドツール
    • glide
      • https://github.com/Masterminds/glide
      • Goコミュニティで多く使われていたパッケージ管理ツール

Goコミュニティで標準なものが

必要になってきた

53 of 61

depの登場

  • 公式によるバージョン管理の導入の実験
    • GopherCon 2016のHack Dayで議論が行われた
    • そこからdepが登場した
    • https://github.com/golang/dep
  • The New Era of Go Package Management
    • GopherCon 2017においての発表
    • depのやっていきを発表
    • semverの推奨

depはgoツールに

直接導入されるものではなかった

54 of 61

そしてGo Modulesへ

  • Go Modulesの特徴
    • Import Compatibility Rule
    • Minimal Version Selection
    • モジュールという単位でバージョン管理

55 of 61

Import Compatibility Rule

  • importパスが同じ場合は後方互換性を維持する
    • 後方互換性が取れない場合はインポートパスを変える

import "github.com/tenntenn/hoge"

import hoge "github.com/tenntenn/hoge/v2"

後方互換性が担保できない場合

56 of 61

Minimal Version Selection

  • 最小バージョンの選択
    • 選択できるバージョンのうち最も古いバージョンを選択
    • どんどんバージョンアップされても常に同じ(=古い)ものを使う
    • 特定のバージョンを指定すれば新しいものを使うことはできる
    • 依存モジュールの下限だけ指定することによって、一意にビルドに使用するバージョンが特定できる

57 of 61

モジュール

  • バージョン付けを行う単位
    • go.modファイルを使って依存モジュールを記述
    • バージョンはsemverで記述する
    • 特定のコミットも指定できる

// My hello, world.��module "rsc.io/hello"��require (� "golang.org/x/text" v0.0.0-20180208041248-4e4a3210bb54� "rsc.io/quote" v1.5.2�)

モジュール名

依存しているモジュール

依存しているモジュールのバージョン

58 of 61

セマンティックバージョンニング

  • バージョンの付け方のルール
    • semverと略される
    • v0.0.2やv1.1.1などと表記する
  • バージョンのあげ方
    • 互換が崩れる場合はメジャーバージョン(例:v1.2.3 v2.0.0
    • 機能追加の場合はマイナーバージョン(例:v1.2.3 v1.3.0
    • バグ修正の場合はパッチバージョン(例:v1.2.3 v1.2.4

X.Y.Z

メジャーバージョン

マイナーバージョン

パッチバージョン

59 of 61

go modコマンド

  • 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以下にコピーする

60 of 61

go installでCLIツールのインストール

  • Go1.16からgo installを使うようになった
    • go installならバージョンを指定してインストールできる
      • latestで最新リリース版(なければ開発版)
      • v1.2.3のようにsemverで指定できる
      • ブランチでもOK(例@main
    • GOPATH/bin以下にインストールされる
      • 環境変数GOBINが設定されている場合はそこに入る
    • go getは引き続きモジュールの取得に使用できる

# gpのインストール

$ go install github.com/tenntenn/goplayground/cmd/gp@latest

61 of 61

まとめ

  • Goを始めよう
    • 始めやすい言語
    • いろんな企業が採用している
  • 公式ドキュメントを読もう
    • ブログもいいけど、公式ドキュメントを読もう
    • 翻訳サービスで翻訳すれば英語も怖くない