Slide 1

Slide 1 text

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 tenntenn Conference 2022 2022年01月15日(土) 資料:https://tenn.in/conn22-keynote 動画:https://tenn.in/conn22-keynote-video

Slide 2

Slide 2 text

上田拓也 Go ビギナーズ
 Go Conference
 @tenntenn tenntenn.dev Google Developer Expert (Go) 一般社団法人 Gophers Japan 代表理事 Experts Team

Slide 3

Slide 3 text

人類Gopher化計画 Gopher = Goエンジニア、Goのマスコットキャラクター https://tenn.in/gopherize

Slide 4

Slide 4 text

発表内容 ■ 2022年にGoを始める人向けの最新情報 ● 最新版の開発環境構築方法 ● 重要なドキュメントや記事 ● よく勘違いされやすい古い情報 ■ すでにGoを学習している人向けの情報 ● 公式サイトや公式ドキュメント情報の整理 ● Go Modulesなど何となく理解している情報の整理 参考:Goとは?特徴や仕事に使うことを目指すための勉強法などを解説

Slide 5

Slide 5 text

Goとは

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Goの特徴 − 強力でシンプルな言語設計と文法 − ■ スクリプト言語の書きやすさ ● 冗長な記述は必要ない ■ 型のある言語の厳密さ ● 曖昧な記述はできない ■ 考えられたシンプルさ ● 機能を増やすことで言語を拡張していくことはしない 10 Goに入ってはGoに従え = 言語の思想を理解しよう

Slide 11

Slide 11 text

Goの特徴 − 並行プログラミング − ■ ゴールーチン ● 軽量なスレッドに近いもの ● goキーワードをつけて関数呼び出し ■ チャネル ● ゴールーチン間のデータのやり取り ● 安全にデータをやり取りできる 11 チャネル ゴールーチン A ゴールーチン B データ データ // 関数fを別のゴールーチンで呼び出す go f()

Slide 12

Slide 12 text

Goの特徴 − 豊富な標準ライブラリ − ■ 標準ライブラリ一覧  https://golang.org/pkg/ 12 fmt 書式に関する処理など net/http HTTPサーバなど archive, compress zipやgzipなど encoding JSON, XML, CSVなど html/template HTMLテンプレート os, path/filepath ファイル操作など

Slide 13

Slide 13 text

Goの特徴 − 周辺ツールの充実 − ■ go toolとして標準/準標準で提供 ■ サードパーティ製のツールも充実 ■ IDEによらない独立したツールとして提供 13 go build ビルドを行うコマンド go test xxxx_test.goに書かれたテストコードの実行 go doc, godoc ドキュメント生成 gofmt, goimports コードフォーマッター go vet コードチェッカー gopls Language Server Protocol (LSP) の実装

Slide 14

Slide 14 text

Goの特徴 − シングルバイナリ・クロスコンパイル − ■ シングルバイナリになる ● コンパイルするとデフォルトでは単一の実行可能ファイルになる ● 動作環境を特別に用意しなくてもよい ■ クロスコンパイルできる ● 開発環境とは違うOSやアーキテクチャ向けのバイナリが作れる ● 環境変数のGOOSとGOARCHを指定する   14 # Windows(32ビット)向けにコンパイル $ GOOS=windows GOARCH=386 go build # Linux(64ビット)向けにコンパイル $ GOOS=linux GOARCH=amd64 go build ※ go build はGoのソースコードをビルドするコマンド

Slide 15

Slide 15 text

Goが活用できる領域

Slide 16

Slide 16 text

Goの利用状況 16 引用元:https://go.dev/blog/survey2020-results ■ 76%が職場でGoを使用 ● 66%がGoは会社の成功に不可欠 ■ 76%が5ヶ月でバージョンアップしてる ■ 主にAPI、CLI、Web、DevOpsなどに利用 ● 2019年と傾向は変わらず

Slide 17

Slide 17 text

Goで開発されている著名なOSS ■ クラウド関連のOSSが多い ● Docker ● Kubernetes ● gVisor

Slide 18

Slide 18 text

Goを製品開発に利用している企業例 ■ 海外 ● PayPal ● American Express ● セールスフォース ● Netflix ● Uber ● Twitter ● Dropbox ■ 日本 ● メルカリ・メルペイ ● サイバーエージェント ● DeNA ● エウレカ ● グノシー

Slide 19

Slide 19 text

Goを学ぶ

Slide 20

Slide 20 text

公式のチュートリアルで学ぶ ■ 豊富なチュートリアル群 ● https://go.dev/doc/tutorial/ チュートリアル 説明 Getting started Hello, World Create a module 複数パートから成る一通りのモジュール作成の流れを学べる Accessing a relational database RDBを使った基礎 Developing a RESTful API with Go and Gin Ginを使ったRESTful APIの基礎 Getting started with generics Go1.18から入るジェネリスのチュートリアル Getting started with fuzzing Go1.18から入るFuzzingのチュートリアル A Tour of Go 文法の基礎などをインタラクティブに学ぶ

Slide 21

Slide 21 text

A Tour of Go ■ ブラウザ上で実行できるチュートリアル ● https://tour.golang.org 21

Slide 22

Slide 22 text

Shizuoka.goによる解説 ■ A Tour of Goを動画で解説 ● A Tour of Go 実装完了! ● YouTubeのプレイリスト

Slide 23

Slide 23 text

Play with Go ■ Web上でハンズオンを行う事ができる ● https://play-with-go.dev/ 23

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

プログラミング言語Go完全入門 ■ 全15章からなるGoの入門教材 ● http://tenn.in/go ● https://engineering.mercari.com/blog/entry/2020-03-17-120137/ ● https://engineering.mercari.com/blog/entry/goforbeginners/ ■ 目次 1. Goに触れる 2. 基本構文 3. 関数と型 4. パッケージ 5. コマンドラインツール 6. 抽象化 7. エラー処理 8. テストとテスタビリティ 9. ゴールーチンとチャネル 10. HTTPサーバとクライアント 11. データベース 12. テキスト処理 13. リフレクション 14. 静的解析とコード生成 15. ジェネリクス(型パラメタ)

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

書籍で学ぶ New!!

Slide 30

Slide 30 text

各地のコミュニティで学ぶ Sendai.go Okinawa.go Umeda.go Fukuoka.go Shizuoka.go golang.tokyo Women Who Go Tokyo Okayama.go など...

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

海外カンファレンスで学ぶ ■ GopherCon ● https://www.gophercon.com/ ● 世界最大のGoのカンファレンス ● 世界各地から2000人以上のGoのエンジニアがあつまる ● スピーカーは渡航費等が無料になる ■ その他のカンファレンス ● https://github.com/golang/go/wiki/Conferences 33

Slide 34

Slide 34 text

インターンシップで学ぶ ■ Go1.18が学べる短期インターシップ(5日間) ● https://mercan.mercari.com/articles/31914/ ● 1/20まで応募可 ● 学生向け ● 時給:2,500円

Slide 35

Slide 35 text

開発環境の構築

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

Gitのインストール ■ macOS ● ターミナルでgitと打てばインストールが開始される ● brew install git でもインストールできる ■ Windows ● Git for Windowsのインストールの仕方 ● ターミナルはGitBashを使った方が干渉しない

Slide 38

Slide 38 text

Goの開発環境のインストール ■ 公式サイトからダウンロード ● インストーラーなどで簡単にインストールできる 38

Slide 39

Slide 39 text

◯◯envは必要か? ■ 複数のバージョンが共存できる ● 公式の方法だから謎のバグに悩まなくていい ○ https://golang.org/doc/manage-install#installing-multiple ● 環境変数のPATHを通すだけで十分 # Go1.16.1をインストールする $ go install golang.org/dl/go1.16.1@latest $ go1.16.1 download

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

コンパイルと実行 ■ go buildコマンド ● コンパイルして実行可能ファイル(バイナリ)を生成 ■ go runコマンド ● コンパイルから実行まで行う $ go build main.go $ go build . $ go build pkgname $ go run main.go $ go run . $ go run pkgname

Slide 42

Slide 42 text

よく使われるエディタとIDE ■ この他にもたくさんある 42

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Visual Studio Code(VS Code) ■ マイクロソフトが開発しているエディタ ● Windows、Linux、macOSで動く ● 無料で使える ● .goファイルを開こうとするとGo拡張をインストールするか聞く ● Go拡張はGoの公式プロジェクト ○ https://blog.golang.org/vscode-go ● Live Shareが便利 ● vscode.devではプラグインが動かない 44

Slide 45

Slide 45 text

Go Modules

Slide 46

Slide 46 text

Go1.0以前の話 ■ Makefileを使っていた ● 6g(コンパイラ)や6l(リンカ)を使ってビルド ● サンプルのMakefileが付いていてそれを利用していた ● 依存関係はMakefileの中にかかれていた ● gobuildというラッパーも存在していた 参考:https://ymotongpoo.hatenablog.com/entry/2015/10/13/104247

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

ベンダリング ■ ライブラリのベンダリング ● vendor以下に置くとimportで優先される ● バージョン指定はできない $ tree . main.go vendor └── github.com └── mitchellh └── cli

Slide 51

Slide 51 text

ビルドが解決できない例 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以上に依存 バ グ うまくビルドができない!

Slide 52

Slide 52 text

バージョン管理ツールの登場 ■ サードパーティ製のツール類が登場し始める ● GB ○ https://getgb.io/ ○ プロジェクトベースのビルドツール ● glide ○ https://github.com/Masterminds/glide ○ Goコミュニティで多く使われていたパッケージ管理ツール 参考:https://github.com/golang/go/wiki/PackageManagementTools Goコミュニティで標準なものが 必要になってきた

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

そしてGo Modulesへ ■ Go Modulesの特徴 ● Import Compatibility Rule ● Minimal Version Selection ● モジュールという単位でバージョン管理 参考:Go Modules Reference

Slide 55

Slide 55 text

Import Compatibility Rule ■ importパスが同じ場合は後方互換性を維持する ● 後方互換性が取れない場合はインポートパスを変える import "github.com/tenntenn/hoge" import hoge "github.com/tenntenn/hoge/v2" 後方互換性が担保できない場合

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

モジュール ■ バージョン付けを行う単位 ● 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 ) モジュール名 依存しているモジュール 依存しているモジュールのバージョン 参考:go.mod file reference

Slide 58

Slide 58 text

セマンティックバージョンニング ■ バージョンの付け方のルール ● 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 メジャーバージョン マイナーバージョン パッチバージョン 参考:https://semver.org/lang/ja/

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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