Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
🐭 Goに入門しよう
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
⛵️ 長谷川 広樹 🐬
May 27, 2021
Programming
780
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
🐭 Goに入門しよう
社内LTにて、Goを布教しようと試みましたʕ◔ϖ◔ʔ
⛵️ 長谷川 広樹 🐬
May 27, 2021
More Decks by ⛵️ 長谷川 広樹 🐬
See All by ⛵️ 長谷川 広樹 🐬
『Kubernetes ☸️ で実践する Platform Engineering 』を最高速度で読み抜いたる!!👊🏻
hiroki_hasegawa
1
210
♾️ マルチプロダクトの巨大組織でマイクロサービス開発を支えるCICDプラットフォーム設計
hiroki_hasegawa
5
4.8k
🐙 KubernetesのマルチテナントパターンとArgoCDの実践テナント設計
hiroki_hasegawa
4
3.8k
🧑🚀 tfstate の分割パターンとディレクトリ構成への適用
hiroki_hasegawa
8
8.7k
⛵️ Istioのサービス間通信を実現するサービスディスカバリーの仕組み
hiroki_hasegawa
3
7.6k
🔍 可観測性に入門しよう
hiroki_hasegawa
1
1.2k
🏗️ ドメイン駆動設計と依存性逆転の原則
hiroki_hasegawa
14
10k
🤝🏻 依存関係と依存オブジェクト注入
hiroki_hasegawa
2
1.4k
♾️ SREに入門しよう
hiroki_hasegawa
1
940
Other Decks in Programming
See All in Programming
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
290
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
630
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
9
4.4k
AIが無かった頃の素敵な出会いの話
codmoninc
1
340
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
330
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
610
yield再入門 #phpcon
o0h
PRO
0
870
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
140
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
380
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
3.4k
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
730
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
180
Featured
See All Featured
WENDY [Excerpt]
tessaabrams
11
39k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
470
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
620
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Side Projects
sachag
455
43k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
190
Automating Front-end Workflow
addyosmani
1370
210k
Evolving SEO for Evolving Search Engines
ryanjones
0
250
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
190
Transcript
Goに入門しよう 株式会社ユニクエスト 長谷川広樹 github.com/hiroki-it @Hiroki__IT
自己紹介 ▼ お仕事 最近:クラウドインフラ、IaC、CICD、... 以前:DDD ▼ 関心のある技術領域 ・クラウドインフラ ・IaC ・DDD
github.com/hiroki-it @Hiroki__IT 長谷川 広樹 (はせがわ ひろき) 株式会社ユニクエスト
目次 ▪ Goの概要 ▪ Goの基本文法 ▪ Goのよいところ ▪ Goへの批判 ※悪いところではない
Goの概要(1) ▪ 静的型付け言語 ・ソースコードの実行前にビルドの作業が必要 ・ビルドの成果物 = アーティファクト https://www.atmarkit.co.jp/ait/articles/1105/23/news128.html
Goの概要(2) ▪ 言語としての種類 ・手続き型言語 ・クラスや継承の機能がない(※後述) 第9回 UMTPモデリング技術 ワークショップ https://umtp-japan.org/
Goの基本文法(1) package <パッケージ名> // 名前空間の宣言 import "<パッケージ名>" // パッケージの読み込み func
Xxx(x string) string { // 関数 } ・一つのディレクトリ内では一つのパッケージ名のみ. ・関数名は,頭文字が大文字だとパブリック,小文字だとプライベートになる. ・引数と返却値に型付けが必要.
Goの基本文法(2) ▪ エントリポイント ・処理開始地点になるプログラム ・PHPでいうindex.php ▪ Goのエントリポイント ・mainパッケージ ・インポートパッケージ ・main関数
// エントリーポイント // パッケージ名 package main // インポートパッケージ import "fmt" // 関数 func main() { fmt.Printf("%#v\n", "Hello world!") }
Goの基本文法(3) ▪ 構造体 ・クラスのようなもの ・データのみを保持 ・頭文字の大小で パブリック/プライベートを制御 ▪ 構造体と関数の関連付け ・構造体に関数を持たせる
・構造体から関数をコールできる (メソッド化) ・継承の廃止については後述 // 構造体 type Name struct { FirstName string LastName string } // コンストラクタ func NewName(firstName string, lastName string) *Name { return &Name{ FirstName: firstName, LastName: lastName, } } // フルネームを返却するメソッドを関連付ける func (name *Name) fullName() string { return fmt.Sprintf("%s %s", name.FirstName, name.LastName) }
一旦,ここまでで何かあれば...
Goのよいところ(1)※個人的には一番面白い ▪ マルチスレッド下の並列処理 ・処理を同時に開始 ・関数でGoルーチンを宣言 ・シングルスレッド下の非同期処理とは異なる ・非同期処理と同様に完了を待機する実装が必要 ▪ 使いどころ ・反復処理で一つの関数を複数回コール
・互いに独立した計算処理 ・互いに独立したAPIリクエスト処理 package main func hoge() { // 何らかの処理 } func fuga() { // 何らかの処理 } func main() { go hoge() // 同時実行 go fuga() // 同時実行 } サンプル: https://play.golang.org/p/4XdtMRsgu5t
Goのよいところ(2) ▪ 型付けの厳格さ ・定義に必ず型付けが必要 ・型定義しないとエラーになる ・開発時にバグを潰せる ▪ 型推論 ・変数定義に『:=』を使い,型を推論 ・型定義なしに静的型付けのメリットを享受
package main import "fmt" func quotient(x int, y int) int { // 商を計算する. quotient := x / y // 商を返却する. return quotient } func main() { fmt.Println(quotient(2, 2)) } サンプル: https://play.golang.org/p/1Vw-zsJKlYh
Goのよいところ(3) ▪ バグを生まないようにするコマンド達 ・go fmt: ソースコードを自動整形. ・go vet: バグではないが,問題が起こりそうな実装方法を指摘 ・go
test: xxx_test.goファイルの『TestXxx()』をテストする サンプル: https://play.golang.org/p/omHow7_lOs9
Goのよいところ(4) 言語名 1回目 2回目 3回目 Go 541.38秒 546.18秒 543.36秒 C言語
563.23秒 563.32秒 561.96秒 Java 543.91秒 543.08秒 541.13秒 Python 18時間程度 18時間程度 18時間程度 ihttps://github.com/meideru/PrimeSpeedTest ▪ コンパイルが速い ・他の静的型付けや動的型付けよりもコンパイルが速い ・Javaは中間言語に一度変換する必要があるが,Goでは直接機械語に翻訳可能 指定した数値範囲内の素数を出力するプログラムでのコンパイル速度検証
Goのよいところ(5) ▪ ほどよくシンプル ・黒魔術的な関数やライブラリがない一方で,基本的な機能は揃っている ・フレームワークは使わないことがデファクトスタンダード ・少々コード量が増えたとしても,黒魔術より基本的機能の組み合わせを優先 ・可読性が高く,後続者が開発しやすい ▪ PHPは便利なものがたくさん一方で,難解な実装になりがち ・強力過ぎるフレームワークやライブラリたち
・array_xxxxx 関数 ・高階関数
Goのよいところ(6) func Division(x int, y int) (int, int) { //
商を計算する. quotient := x / y // 余りを計算する. remainder := x % y // 商と余りを返却する. return quotient, remainder } ▪ 複数の返却値 ・複数の値をシンプルに返却可能. ・並列処理を組み合わせると可能性∞
Goへの批判(1-1)※悪いところではない ▪ クラスや継承の機能がない ・クラスの継承には問題点があり,『継承はカプセル化を壊す』で検索 ・思想として,クラスや継承を廃止した ・継承よりも『委譲』の方が優れている ▪ 代わりに委譲を使わせる思想 ・処理の一部/全てを他クラスに託す方法 ・PHPでは,Interfaceの実装などで実現可能
・Goでは,『埋め込み』で実現
Goへの批判(1-2)※悪いところではない // Nameから処理を委譲された type MyName struct { *Name } //
コンストラクタ func NewMyName(name *Name) *MyName { return &MyName{ Name: name, } } type Name struct { FirstName string LastName string } func NewName(firstName string, lastName string) *Name { return &Name{ FirstName: firstName, LastName: lastName, } } // フルネームを返却 func (name *Name) fullName() string { return fmt.Sprintf("%s %s", name.FirstName, name.LastName) } 埋め込む側(委譲元) 埋め込まれる側(委譲先)
Goへの批判(1-3)※悪いところではない func main() { // 埋め込む側の構造体の初期化 name := NewName("Hiroki", "Hasegawa")
// コンストラクタインジェクション myName := NewMyName(name) // Name構造体のメソッドをコールできる. fmt.Printf("%#v\n", myName.fullName()) // "Hiroki Hasegawa" } ・埋め込んだ側の構造体が,埋め込まれた構造体にメソッドを託す ・MyName構造体はfullNameメソッドを使用できる
他にも批判はいくつかあるが割愛...
最後に Gopherくん 超かわいい!!! by Takuya Ueda (https://twitter.com/tenntenn) The Gopher character
is based on the Go mascot designed by Renée French.