以下勉強会の資料です。
第138回RITS技術交流会『なぜ私たちはGoを書くのか。今あらためて考えるGo言語の良さと実際』 https://rits-techforum.connpass.com/event/146462/
スライド中のリンク先も確認したい場合は、ブログの補足記事でご確認ください。 https://budougumi0617.github.io/2019/10/05/jrits-why-go-how-is-go/
なぜ私たちはGoを書くのか今あらためて考えるGo言語の良さと実際2019/10/04 第138回RITS技術交流会Yoichiro Shimizu @budougumi0617
View Slide
● 清水 陽一郎 @budougumi0617○ Backend Engineer○ Go / Ruby● Blog○ 毎週書いてる自己紹介2
自己紹介● 埼玉大学大学院数理電子情報系専攻 博士前期課程修了● 2011年 リコーITソリューションズ株式会社入社○ 商業印刷用プリンタの外部コントローラ開発 etc...● Java研修/Java8研修/Go言語研修 受講3https://twitter.com/yoshiki_shibata/status/820074722700296193
自己紹介● 2017年 freee株式会社○ 電子証明書を利用したアカウントアグリゲーション用アプリ( Windows)○ マイナンバーカードを利用した電子申告アプリ( macOS)○ クラウド会計サービスのアカウントアグリゲーション機能のマイクロサービスの開発○ 金融機関とのAPI連携のためのOAuth2.0認証・トークン管理マイクロサービスの開発4https://customers.microsoft.com/ja-jp/story/freee-professional-services-xamarin-azure-visual-studio-japanese-japan
GoConference’19 5
6
自己紹介● 2017年 freee株式会社○ 電子証明書を利用したアカウントアグリゲーション用アプリ( Windows)○ マイナンバーカードを利用した電子申告アプリ( macOS)○ クラウド会計サービスのアカウントアグリゲーション機能のマイクロサービスの開発○ 金融機関とのAPI連携のためのOAuth2.0認証・トークン管理マイクロサービスの開発7https://customers.microsoft.com/ja-jp/story/freee-professional-services-xamarin-azure-visual-studio-japanese-japan
自己紹介● golang.tokyo 運営○ https://golangtokyo.connpass.com/○ メルカリ、DeNA、eureka、freee、Wantedly etc...○ 月イチで勉強会○ 技術書典で合同誌の執筆● Go Conference 運営○ https://gocon.connpass.com/○ 半年に一回カンファレンスを実施■ google Goチーム、海外からの登壇も○ Goのリリースに合わせたリリースパーティ8
Go Conference 2019 Autumn● https://gocon.jp/9
今日のテーマ Goの紹介 実際に使ってみて 10/
アジェンダ● 自己紹介● Goとは● Goが生まれた背景・設計思想● 業務で利用して実感するGoの良さ● 実際にGoを始めるための第一歩11
アンケート 12/
Goを使ったことがある方?13
merpay14
kyash15
Pairs(eureka)16
Nature Remo17
LOVOT (Groove X)18
Wantedly19
Go採用企業● GAFA● Uber● Sony● LINE● DeNA● CyberaAgent● CookPad● Preferred Networks● バンダイナムコ● etc...20
Goで作られたOSS● Docker● Kubernetes● Terraform● Hugo● Prometheus● etc...21
Goが活躍できる場所● Linux / macOS / Windows● Web● IoT● Mobileアプリ● WebAssembly● AWS Lambda / Google Functions● Google App Engine22
Goとは 23/
Goとは● Googleで2007年に考案(OSS化は2009年)○ Robert Griesemer○ Rob Pike○ Ken Thompson● 半年に1度のリリース○ 現在1.13.1が最新24The Go gopher was designed by Renee French.
Goとは● 強い静的型付け、型推論● コンパイル言語● 手続き型● オブジェクト指向ではない● ポインタがある25
● https://blog.golang.org/gopher● マスコットキャラクター● Go's New Brandの中で厳格な(?)仕様がThe Go Gopher26Go Brand Book より
生まれた背景 設計思想 27/
Goは何を目的に作られたのか?● プログラミング言語には生まれた背景・言語哲学がある● 例えばHaskell○ 当時乱立していた関数型言語を統一するため● 例えばRuby○ ストレスなくプログラミングできる28
Goは何を目的に作られたのか?● Go○ ソフトウェア開発の中で発生していた課題解決のため● Go登場以前のGoogleのソフトウェア開発○ C++, Java, Python○ ビルド時間のコスト○ プログラミングコードの安全性29https://talks.golang.org/2012/splash.article
Goは何を目的に作られたのか?● コンパイル速度が速いこと● 安全に書けること● 本質にフォーカスした開発ができること● 「スマートさ」が目的ではない○ ジェネリクス / モナド / ラムダなどはない○ 例外機構もない30https://talks.golang.org/2012/splash.article
● スクリプト言語のプログラミングの容易さ● コンパイル言語の効率と安全性● ネットワークプログラミング● マルチコアコンピューティングGoは何を目的に作られたのか?31https://golang.org/doc/faq#creating_a_new_language
Simplicity - 徹底的な簡潔性● GoのMission○ Creating software at scale○ Running software at scale● システムは成長する際に、デザインの簡潔性を通してのみ、安定し、安全であり、首尾一貫したままでいられる32Go's New Brand の Mission, プログラミング言語 Go まえがき より
● 複雑性は明瞭性を失う例○ No free, Only GC○ 単純な並行処理■ “go”と書くだけ■ no ID■ ステータスSimplicity is Complicated33Simplicity is Complicated より
安定した言語仕様● Simplicityを体現するために● Goは1.0(10年前)から言語仕様がほとんど変わらない○ 予約語も25個から増えない● 今後もGo1.Xのうちは言語仕様は変わらない○ 変わるのはGo2から○ Go 2は4年後(Go 1.20)くらい?34Go2については Toward Go 2 より 微妙な言語仕様の変更はたまに入る(例 :Go.1.10)
● https://blog.golang.org/toward-go2● Go2に至る仕様策定プロセス● Proposalは誰でも見れる○ Go 2 Draft Designs● Go Teamは意見を求めている開かれた仕様策定(Toward Go 2)35英語が難しかったら Gopher Slackの #japan などでも議論してます
● Goは身近なサービス・企業で使われている○ 決済のようなミッションクリティカルなサービスにも● Goはソフトウェア開発の課題解決を目指した言語○ Creating software at scale○ Running software at scale● 単純さの中に生産性を見出している(UNIX思考的)ここまでのまとめ36
言語仕様詳細 特徴 37/
少ない予約語38https://golang.org/ref/spec#Keywords
複素数型● プリミティブな型として複素数をサポート39https://play.golang.org/p/bm9P4fMInGE
スライスとrange● 可変長配列● オブジェクトに対する反復処理40https://go-tour-jp.appspot.com/moretypes/16
ポインタ● ちょっとゆるい● (*p).Xと書かなくても良い41https://go-tour-jp.appspot.com/moretypes/1
interface● ダックタイピングを採用● 提供者ではなく利用者が定義する○ 実装提供者に依存せずに利用できる42https://go-tour-jp.appspot.com/methods/9
goroutineとchannel● ランタイムが管理する軽量スレッド● goroutine間を通信するパイプ43https://go-tour-jp.appspot.com/concurrency/2
多値とエラー● 関数・メソッドは複数の値を返しうる● 例外機構はない44https://go-tour-jp.appspot.com/methods/19
Goの良さ 45/
● gofmt● linterの充実○ 変な争いをしたり不毛な指摘をせずに済む● ほぼDSLを覚えなくて良い○ 脳内メモリをロジックに集中できる● GoDoc業務で利用して実感するGoの良さ46
● 可読性● 再配布の容易性○ 各OS向けに簡単にビルドできる● デプロイ容易性● バイナリイメージの小ささ業務で利用して実感するGoの良さ47
● RailsのようなWAFを使ったスピードには勝てない○ いろいろ選択する必要はある○ 各社内製ライブラリを自作してカバー● ビューの実装は苦手業務で利用して実感するGoの良さ48
Goを始める 49/
● Webブラウザ上でGoの仕様を一通り学べる○ https://tour.golang.org/● 日本語版あり○ https://go-tour-jp.appspot.comTour of Go50
● https://amazon.jp/dp/4621300253● 日本語で書かれたGoの書籍の中で一番体系的な書籍● なぜインターフェースは小さく作るべきか● Goのカプセル化へのアプローチ● なぜtesting pkgにはsetup/teardownやassertがないのか● なぜ例外を持たないのかプログラミング言語Go(書籍)51
● https://amazon.jp/dp/4297107279● 環境構築● CLIツールの作り方● テストの書き方● DBを使ったWebサーバの構築● まずなにか作ってみたい!という時に最適な一冊改訂版 みんなのGo言語(書籍)52
● Goはソフトウェア開発の課題解決を目指した言語○ 単純さの中に生産性を見出している(UNIX的思考)● 単純で高い可読性によるコーディングのしやすさ● デプロイ容易性による活躍の場の広さ○ マルチプラットフォーム○ シングルバイナリ○ 少ないビルド時間まとめ53©tottie | Renee French ( original design )