Upgrade to Pro — share decks privately, control downloads, hide ads and more …

これからはじめるGo - tenntenn Conference 2022

これからはじめるGo - tenntenn Conference 2022

この資料はtenntenn Conference 2022のキーノートにて発表を行った際に用いた資料です。

■ tenntenn Conferenceとは
tenntenn Conferenceはtenntennが主催し、そしてすべてのセッションがtenntennによる登壇のカンファレンスです。

イベントページ:https://tenntenn.connpass.com/event/226562/
ハッシュタグ:#tennconn
資料(Google スライド):https://tenn.in/conn22-keynote
動画:https://tenn.in/conn22-keynote-video
再生リスト:https://tenn.in/conn22-videolist

■ 内容
プログラミング言語Go(Go言語)の概要から学び方、開発環境の構築方法まで2022年現在で最新の情報をお話しています。Goがどのような企業や領域で活用されているのか、どういう教材があるのかなどを解析しています。インターネットで見かける古い情報についても言及していますので、インターネットにある記事の何が古い情報で何が新しい情報なのか知ることができます。

■ 目次
・イントロダクション
・Goとは
・Goを学ぶ
・開発環境の構築
・Go Modules

■ 登壇者&主催者

・名前:tenntenn / 上田拓也
・HP:https://tenntenn.dev
・Twitter:https://twitter.com/tenntenn

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

■ Gopher道場 自習室

https://gopherdojo.org/studyroom/

Gopher道場とは、実践的なGoを体系的に学べる場です。
Gopher道場 自習室では、以下のようなコンテンツや学びの場を提供します。

・Gopher道場の講義を録画した動画(10時間以上分)
・Slackにおける受講者同士のコミュニティ
・Gopher道場卒業生による課題のレビュー(ボランティアでご協力頂いているのでベストエフォートです)

■ Meety(カジュアル面談)

・ソフトウェアエンジニアの地方移住ってどうなの?:https://meety.net/matches/jyZgDkEEwmMk
・メルカリグループにおけるGoの使いどころ:https://meety.net/matches/LbeVbIACxLqk
・地方からの技術コミュニティへの貢献:https://meety.net/matches/gVeMtImLkWJE

■ お仕事の依頼について

副業にて技術顧問やアドバイザーなどを行っています。過去の実績や問い合わせフォームは以下のURLからご確認ください。
https://tenntenn.dev/ja/job/

tenntenn - Takuya Ueda

January 15, 2022
Tweet

More Decks by tenntenn - Takuya Ueda

Other Decks in Programming

Transcript

  1. 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
  2. 上田拓也 Go ビギナーズ
 Go Conference
 @tenntenn tenntenn.dev Google Developer Expert

    (Go) 一般社団法人 Gophers Japan 代表理事 Experts Team
  3. 発表内容 ▪ 2022年にGoを始める人向けの最新情報 • 最新版の開発環境構築方法 • 重要なドキュメントや記事 • よく勘違いされやすい古い情報 ▪

    すでにGoを学習している人向けの情報 • 公式サイトや公式ドキュメント情報の整理 • Go Modulesなど何となく理解している情報の整理 参考:Goとは?特徴や仕事に使うことを目指すための勉強法などを解説
  4. Goとは? ▪ Googleが開発したプログラミング言語 • 2009年11月に最初のバージョンをオープンソースで公開 ◦ 2012年3月に正式バージョンであるGo1.0を公開 ◦ 2022年1月現在の最新バージョンはGo1.17 ◦

    半年毎のペースでバージョンアップ(参考) • Robert Griesemer、Rob Pike、Ken Thompsonによって設計された ▪ 特徴 • 強力でシンプルな言語設計と文法 • 並行プログラミング • 豊富な標準ライブラリ群 • 周辺ツールの充実 • シングルバイナリ・クロスコンパイル 6
  5. Goが開発された理由 ▪ Google内の課題を解決するために開発された • 開発速度の低下 ◦ 超巨大なコードベース ◦ 複雑な依存関係 •

    マルチコア時代のシステム言語 ◦ 並行処理とガベージコレクタを同時に採用 • 軽量プログラミング言語(LL, Light weight Language)の盛り上がり ◦ 静的型付け言語だとコンパイル時にエラーが発見できる ◦ 動的型付け言語だと書きやすい ◦ いいところ取りの書きやすい静的型付け言語がない • 静的解析がしやすい言語 ◦ 言語設計のレベルで静的解析しやすい言語を目指した 7 参考:Go at Google: Language Design in the Service of Software Engineering
  6. Go1の後方互換 ▪ Go1の間は言語の後方互換が保たれる • https://golang.org/doc/go1compat • 言語仕様に破壊的変更が加わらない • 一部例外はある ◦

    セキュリティ、重大なバグなど • Go1.0で書いたコードはGo1.16でもビルドできる ◦ 場合によってはgo fixやgo fmtを掛ける必要がある • Go1を対象に執筆された書籍やブログは言語仕様に関しては 互換が保たれているためGo1.xの間は有効である ◦ ランタイムやgo toolに関しては変更される可能性あり
  7. Goの開発プロセスとGo2 ▪ Goの開発プロセス • 実際にGoを使った中で問題を見つける • 解決策をコミュニティに提案し議論する • 実装して評価する •

    問題なければリリースされる ▪ Go2とは? • https://blog.golang.org/toward-go2 • 明確なターゲットがあるわけではない • Go1.xとして開発されていき、Go1の後方互換が 保てなくなるような変更を加える必要になったら Go2としてリリースされる • 例えば、必ずしもジェネリクスがGo2でリリースされるわけではない ◦ ジェネリクスは早くてGo1.18でリリースされる Goの開発プロセス
  8. Goの特徴 − 強力でシンプルな言語設計と文法 − ▪ スクリプト言語の書きやすさ • 冗長な記述は必要ない ▪ 型のある言語の厳密さ

    • 曖昧な記述はできない ▪ 考えられたシンプルさ • 機能を増やすことで言語を拡張していくことはしない 10 Goに入ってはGoに従え = 言語の思想を理解しよう
  9. Goの特徴 − 並行プログラミング − ▪ ゴールーチン • 軽量なスレッドに近いもの • goキーワードをつけて関数呼び出し

    ▪ チャネル • ゴールーチン間のデータのやり取り • 安全にデータをやり取りできる 11 チャネル ゴールーチン A ゴールーチン B データ データ // 関数fを別のゴールーチンで呼び出す go f()
  10. Goの特徴 − 豊富な標準ライブラリ − ▪ 標準ライブラリ一覧  https://golang.org/pkg/ 12 fmt 書式に関する処理など

    net/http HTTPサーバなど archive, compress zipやgzipなど encoding JSON, XML, CSVなど html/template HTMLテンプレート os, path/filepath ファイル操作など
  11. Goの特徴 − 周辺ツールの充実 − ▪ go toolとして標準/準標準で提供 ▪ サードパーティ製のツールも充実 ▪

    IDEによらない独立したツールとして提供 13 go build ビルドを行うコマンド go test xxxx_test.goに書かれたテストコードの実行 go doc, godoc ドキュメント生成 gofmt, goimports コードフォーマッター go vet コードチェッカー gopls Language Server Protocol (LSP) の実装
  12. Goの特徴 − シングルバイナリ・クロスコンパイル − ▪ シングルバイナリになる • コンパイルするとデフォルトでは単一の実行可能ファイルになる • 動作環境を特別に用意しなくてもよい

    ▪ クロスコンパイルできる • 開発環境とは違うOSやアーキテクチャ向けのバイナリが作れる • 環境変数のGOOSとGOARCHを指定する   14 # Windows(32ビット)向けにコンパイル $ GOOS=windows GOARCH=386 go build # Linux(64ビット)向けにコンパイル $ GOOS=linux GOARCH=amd64 go build ※ go build はGoのソースコードをビルドするコマンド
  13. Goを製品開発に利用している企業例 ▪ 海外 • PayPal • American Express • セールスフォース

    • Netflix • Uber • Twitter • Dropbox ▪ 日本 • メルカリ・メルペイ • サイバーエージェント • DeNA • エウレカ • グノシー
  14. 公式のチュートリアルで学ぶ ▪ 豊富なチュートリアル群 • 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 文法の基礎などをインタラクティブに学ぶ
  15. Shizuoka.goによる解説 ▪ A Tour of Goを動画で解説 • A Tour of

    Go 実装完了! • YouTubeのプレイリスト
  16. Go の最初の手順 by Microsoft ▪ Microsoftが提供するGoのチュートリアル • https://docs.microsoft.com/ja-jp/learn/paths/go-first-steps/ • Go

    の使用を開始する • Go でのパッケージ、変数、関数の使用方法を理解する • Go で制御フローを使用する • Go のデータ型、構造体、配列、スライス、マップを使用する • Go でのエラー処理とログ記録を実装する • Go でメソッドとインターフェイスを使用する • Go でプログラムを作成してテストする
  17. プログラミング言語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. ジェネリクス(型パラメタ)
  18. Goのハンズオン ▪ ガチャを作ろう • 法政大学の集中講義で用いられている資料 ▪ 家計簿アプリを作ろう • コマンドラインツールからWebアプリ作成までを体験できる ▪

    分かるゴールーチンとチャネル • トレーシングをしながら並行処理を学ぶ ▪ テストを書こう • テストの書き方やテクニックを学ぶ ▪ ゲストブックを作ろう • Google App Engineを使ったWebアプリ作成を学ぶ ▪ コマンドラインツールを作ろう • 画像変換を行うコマンドラインツールを作る
  19. 公式ドキュメントで学ぶ ▪ 公式ドキュメント • いろいろあるので目を通すと良い ▪ 言語仕様 • コンパクトな言語仕様なので簡単に読める ▪

    Go Code Review Comments (日本語訳) • Goらしい書き方が学べる ▪ Effective Go • Code Review Commentsより詳しい内容 ▪ パッケージドキュメント • ドキュメントをしっかり読む ▪ 公式ブログ • 最新の情報が記載される
  20. Women Who Go ▪ 女性とジェンダーマイノリティのGoコミュニティ • https://womenwhogotokyo.github.io/ • 月に1回くらい集まって勉強会をしている •

    Goの入門講座やもくもく会などをやっている • Go Conferenceでは初学者向けのハンズオンを担当
  21. 海外カンファレンスで学ぶ ▪ GopherCon • https://www.gophercon.com/ • 世界最大のGoのカンファレンス • 世界各地から2000人以上のGoのエンジニアがあつまる •

    スピーカーは渡航費等が無料になる ▪ その他のカンファレンス • https://github.com/golang/go/wiki/Conferences 33
  22. 開発に必要なもの ▪ Goのツールチェイン(開発環境) • Goのソースコードを機械語に翻訳するためのコンパイラなど • 標準パッケージや開発に便利なツール類も含まれる ▪ エディタ・統合開発環境(IDE) •

    Goのソースコードを編集するために必要 • 好みによって好きなエディタやIDEを選ぶ ▪ Git • ソースコードのバージョン管理ツール • go toolの中で使われている 36
  23. Gitのインストール ▪ macOS • ターミナルでgitと打てばインストールが開始される • brew install git でもインストールできる

    ▪ Windows • Git for Windowsのインストールの仕方 • ターミナルはGitBashを使った方が干渉しない
  24. GOPATHとGOROOTの設定は? ▪ 特に理由がなければ不要 • GOPATHはデフォルト値がある • GOROOTはgoコマンドが知っている • Go Modulesを使う前提なのでGOPATHのことは忘れても良い

    ◦ なくなった訳ではないけど意識しなくてよい • 環境変数はgo envコマンドで取得できる ◦ 環境変数として設定されていないものはデフォルト値 ▪ 古い情報を参考にしないようにしよう • Go1.11からGo Modulesが利用されるようになりました • それ以前の情報はあまり参考にしないようにしよう • 公式ドキュメントを翻訳サービスで翻訳しながら読むのがオススメ
  25. コンパイルと実行 ▪ go buildコマンド • コンパイルして実行可能ファイル(バイナリ)を生成 ▪ go runコマンド •

    コンパイルから実行まで行う $ go build main.go $ go build . $ go build pkgname $ go run main.go $ go run . $ go run pkgname
  26. GoLand ▪ JetBrains製のGoのIDE • https://www.jetbrains.com/go/ • 多くのGopherが使っている • 補完が高速 •

    インタフェース実装へのジャンプ • リファクタリング機能 • デバッガ • 有料 • 条件付きの無料プランもある ◦ 学生は無料! 43
  27. Visual Studio Code(VS Code) ▪ マイクロソフトが開発しているエディタ • Windows、Linux、macOSで動く • 無料で使える

    • .goファイルを開こうとするとGo拡張をインストールするか聞く • Go拡張はGoの公式プロジェクト ◦ https://blog.golang.org/vscode-go • Live Shareが便利 • vscode.devではプラグインが動かない 44
  28. goinstallの登場 ▪ 2010年2月に登場 ▪ GitHubやBitbucketからダウンロードして配置する ▪ Makefileほどの柔軟性はないが利便性が向上 ▪ インポートパスのルールの確立 •

    ソースコードの中にすべての依存関係が記述される • go vetなどの静的解析ツールが簡単につくれるようになった ▪ 2012年2月のGo1.0リリースでgo getに
  29. go getの登場で解決したこと ▪ 簡単にビルドができるようになった ▪ 作ったものを簡単に公開・再利用できるようになった • 現在のGoのコミュニティを形成する上で重要なファクター • go

    getすることで簡単に他の人が作ったパッケージを利用できる ▪ ビルドシステムを意識しなくてよい • 6gや6lなどを気にしなくてよい • 依存関係の解決方法などは勝手にやってくれる
  30. go getで解決できなかったこと ▪ バージョン付けとAPIの安定性 • バージョン付けができない • アップデートによって何が変わるのかユーザに提示できない • gopkg.inなどの登場

    ▪ ベンダリングとビルドの再現可能性 • ビルドの再現性がとれない • 取得時に常に最新を見てしまうこと • godep、glide、GBなどの登場 • ベンダリングの対応(Go1.5以上)
  31. ビルドが解決できない例 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以上に依存 バ グ うまくビルドができない!
  32. バージョン管理ツールの登場 ▪ サードパーティ製のツール類が登場し始める • GB ◦ https://getgb.io/ ◦ プロジェクトベースのビルドツール •

    glide ◦ https://github.com/Masterminds/glide ◦ Goコミュニティで多く使われていたパッケージ管理ツール 参考:https://github.com/golang/go/wiki/PackageManagementTools Goコミュニティで標準なものが 必要になってきた
  33. depの登場 ▪ 公式によるバージョン管理の導入の実験 • GopherCon 2016のHack Dayで議論が行われた • そこからdepが登場した •

    https://github.com/golang/dep ▪ The New Era of Go Package Management • GopherCon 2017においての発表 • depのやっていきを発表 • semverの推奨 depはgoツールに 直接導入されるものではなかった
  34. そしてGo Modulesへ ▪ Go Modulesの特徴 • Import Compatibility Rule •

    Minimal Version Selection • モジュールという単位でバージョン管理 参考:Go Modules Reference
  35. Minimal Version Selection ▪ 最小バージョンの選択 • 選択できるバージョンのうち最も古いバージョンを選択 • どんどんバージョンアップされても常に同じ(=古い)ものを使う •

    特定のバージョンを指定すれば新しいものを使うことはできる • 依存モジュールの下限だけ指定することによって、一意にビルドに使用す るバージョンが特定できる
  36. モジュール ▪ バージョン付けを行う単位 • 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
  37. セマンティックバージョンニング ▪ バージョンの付け方のルール • 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/
  38. 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以下にコピーする
  39. 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
  40. まとめ ▪ Goを始めよう • 始めやすい言語 • いろんな企業が採用している ▪ 公式ドキュメントを読もう •

    ブログもいいけど、公式ドキュメントを読もう • 翻訳サービスで翻訳すれば英語も怖くない