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
Javaプログラマのための頑張らないGo入門
Search
yy_yank
November 23, 2019
Programming
0
13
Javaプログラマのための頑張らないGo入門
2019年にJJUG CCC 2019 Fall で発表したものです(SlideShareからお引越し)。
yy_yank
November 23, 2019
Tweet
Share
More Decks by yy_yank
See All by yy_yank
結局、リファクタリングって何なのか 〜掃除から紐解くリファクタリング〜(refactoring vs room cleaning)
yyyank
0
210
R2DBCでAPIの高速化をしようとしてやめた話
yyyank
0
790
Debeziumで変更データキャプチャを学ぼう #jjug_ccc
yyyank
0
610
サーバーサイドKotlinという選択肢とユーザベース
yyyank
0
230
Other Decks in Programming
See All in Programming
App Router 悲喜交々
quramy
7
360
型付きで行うVSCode拡張機能開発 / VSCode Meetup #31
mazrean
0
190
CSC305 Lecture 01
javiergs
PRO
1
140
◯◯エンジニアになった理由
gessy0129
PRO
0
560
Applied NLP in the Age of Generative AI
inesmontani
PRO
3
1.1k
クラウドサービスの 利用コストを削減する技術 - 円安の真南風を感じて -
pyama86
3
230
"noncopyable types" の使いどころについて考えてみた
andpad
0
120
GitHub Copilot Workspace で我々のアプリ開発がどう変わるのか?
shuyakinjo
0
830
NEWTにおけるiOS18対応の進め方
ryu1sazae
0
170
NANIMACHI
naokiito
0
920
グローバルなソフトウェアテスト組織における課題と戦略 / Challenges and Strategies in a Global Software Testing Organization #mf_techday
imtnd
0
210
Progressive Web Apps for Rails developers
siaw23
2
510
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
227
52k
Embracing the Ebb and Flow
colly
83
4.4k
Principles of Awesome APIs and How to Build Them.
keavy
125
17k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
230
17k
Music & Morning Musume
bryan
46
6.1k
Git: the NoSQL Database
bkeepers
PRO
425
64k
Bash Introduction
62gerente
608
210k
The Pragmatic Product Professional
lauravandoore
31
6.2k
Producing Creativity
orderedlist
PRO
340
39k
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
Bootstrapping a Software Product
garrettdimon
PRO
304
110k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
124
18k
Transcript
Javaプログラマのための 頑張らないGo入門 JJUG CCC 2019 Fall #ccc_g2 #jjug_ccc @yy_yank
#ccc_g2 #jjug_ccc でつぶやいてください ハッシュタグ TODO ハッシュタグ
自己紹介 やんく(@yy_yank) こいつです ・(株)Abbyのプログラマ ・JJUG CCC登壇4回目? ・iconはsakuraエディタなのに ・vim使う ・Java,Kotlin,Goが好き
「あれ、JavaのカンファレンスでGoの話するの か?するのか。いいのか?」 採用されて我に返った僕
頑張らないって タイトルにしたけど 頑張っていきましょう
でもGoを知る近道にはな るかも?
というセッション (にしたい)
このセッションは Goを知り興味を持つきっかけ という位置付けです。 Goを深く学びたい方向けではありません。 NOTE NOTE
・このセッションは個人の感想です。所属企業のうん ぬんかんぬんではありません。 ・ワタシJavaスキ ・ワタシGoもスキ ・言語がスキ NOTE
・もちろん主観はありますが、それぞれの言語に対し てフェアに ・良いところを伝えていければ ・Javaの話ほとんどないです NOTE NOTE
・Goってあれでしょ?電車でGoだよね ・なんかGoっていう言語があるらしい ・Go気になるのでちょっととっかかりが欲しい ぐらいの人 ここにいる人の想定
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ
・イントロダクション(僕の思うGoとJava) 冒頭から含めて15分 ・Goことはじめ 7分 ・Goってこんなコード 9分 ・Goの特徴 10分 ・Go使いはじめ(yy_yank目線) 4.5分
・Goを使ってハマった編(yy_yank目線) 2分 ・まとめ 0.5分 アジェンダ 発表練習時 RTA(Real Time Attack)の結果です
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ イントロダクションという名の
言いたいこと先に言っとくやつ
「GoとJavaを並べるのは筋が悪い」 架空の人:
「わかる」 ぼく:
・JavaとGoを比べるのは筋が悪い(と思う) ・Javaならこう出来る…を捨てる ・しかし、言語に対してフェアに ・他の言語を知ってると、Goを一通り触らないと良い言語には感じ ないのではと思う(食わず嫌い的な) →なんかWebアプリでも作ってみて欲しい イントロダクション(僕の思うGoとJava)
・すべてを忘れてGoを書いてみるとジワジワ良さを感じてくる(効 果には個人差があります) ・なんか物足りねえけどなんとかなるなぁみたいな ・ほーいいじゃないか、こういうのでいいんだよこういうので(出典: 孤独のグルメ) イントロダクション イントロダクション(僕の思うGoとJava)
・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクション イントロダクション(僕の思うGoとJava)
・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクション イントロダクション(僕の思うGoとJava) goルーチンはすげえ軽い。Javaの スレッドは1スレッド固定長1MB(デ フォルト)、goルーチンは4KBの動的
割り当て
・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクション イントロダクション(僕の思うGoとJava) Why you can
have millions of Goroutines but only thousands of Java Threads で検索 https://rcoh.me/posts/why-you -can-have-a-million-go-routines- but-only-1000-java-threads/
・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクション イントロダクション(僕の思うGoとJava) graalあたりで頑張るで! (今後数年が楽しみ)
・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクション イントロダクション(僕の思うGoとJava) channelでmessage passingがとて も楽。そしていろんなパターンが出
来る
・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクション イントロダクション(僕の思うGoとJava) Go Concurrency Patterns
で検索 https://talks.golang.org/2012/c oncurrency.slide#1
・Javaで作れるものは割とGoで作れる(別に低レイヤーのみでも ない) ・しかしJavaのようにGoを書こうとするとこじれる ・GoらしくGoを書くのが良い →だがそれが難しい(業務で感じたところ←今ココ) イントロダクション イントロダクション(僕の思うGoとJava)
・Javaで作れるものは割とGoで作れる(別に低レイヤーのみでも ない) ・しかしJavaのようにGoを書こうとするとこじれる ・GoらしくGoを書くのが良い →だがそれが難しい イントロダクション イントロダクション(僕の思うGoとJava) Goの方が得意そうなのはTUI、 CLI(コマンド)系、並行処理(記述が 簡単という意味では)
・Javaで作れるものは割とGoで作れる(別に低レイヤーのみでも ない) ・しかしJavaのようにGoを書こうとするとこじれる ・GoらしくGoを書くのが良い →だがそれが難しい イントロダクション イントロダクション(僕の思うGoとJava) Goで何を作ることが出来るかわかる 良い資料(日本語) What
you can do with Go https://speakerdeck.com/po3rin /what-you-can-do-with-go
・JavaもGoも開発のための手段 ・手段だけどプログラマにとって大事なもの、選べる手段は多い方 が良い ・GoはJavaの代替にもなるし、Javaでは扱いにくい部分も対応出 来る(TUIやCUIなど) ・メモリ食いにくいので手軽 イントロダクション イントロダクション(僕の思うGoとJava)
・JavaもGoも開発のための手段 ・手段だけどプログラマにとって大事な道具、選べる道具は多い 方が良い ・GoはJavaの代替にもなるし、Javaでは扱いにくい部分も対応出 来る(TUIやCUIなど) ・メモリ食いにくいので手軽 イントロダクション イントロダクション(僕の思うGoとJava) 手札を増やしてみませんか? というのがJavaプログラマへ僕か
ら出来るGoのススメ (Java好きの人はJavaがとても好きなの知ってるけど )
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ
・言い尽くされているがGoに入ればGoに従え Goの目指しているところを知って、それに乗れば自然とうまくいく はず ・Goは素直なようでクセがある Goことはじめ Goことはじめ
Go言語の初心者が見ると幸せになれる場所 #golang https://qiita.com/tenntenn/items/0e33a4959250d1a5504 5 Goことはじめ(Goに従う情報源) 迷える人にオススメ Goことはじめ(Goに従う情報源)
A Tour of Go http://go-tour-jp.appspot.com/#1 Goことはじめ(Goに従う情報源) ササッと触ってみたい 人向け Goことはじめ(Goに従う情報源)
Frequently Asked Questions (FAQ) https://golang.org/doc/faq Goことはじめ(Goに従う情報源) 色々気になることが 多い人向け Goことはじめ(Goに従う情報源)
みんなのGo言語 Goことはじめ(Goに従う情報源) 実用的な軽めの本読みたい人向け パラパラ漫画したい人向け Goことはじめ(Goに従う情報源)
プログラミング言語Go(がっつり言語仕様知りたい人) Go言語による並行処理(goルーチンあたり知りたい人) Goならわかるシステムプログラミング(良い本) Goことはじめ(Goに従う情報源) しっかり 本読みたい人向け Goことはじめ(Goに従う情報源)
Effective Go https://golang.org/doc/effective_go.html Goことはじめ(Goに従う情報源) Go書いてて指針が 欲しい人向け Goことはじめ(Goに従う情報源)
Go Patterns http://tmrts.com/go-patterns/ Goことはじめ(Goに従う情報源) builderパターンとか Functional Optionとか たまに便利 Goことはじめ(Goに従う情報源)
Standard Go Project Layout https://github.com/golang-standards/project-layout Goことはじめ(Goに従う情報源) 名前に困ったら。 あくまで参考程度に Goことはじめ(Goに従う情報源)
Awesome Go https://awesome-go.com/ Goことはじめ(Goに従う情報源) イケてるライブラリを 使おう(ご利用は計画的に) Goことはじめ(Goに従う情報源)
uber-go/guide https://github.com/uber-go/guide Goことはじめ(Goに従う情報源) 最近話題になってました。参 考程度に Goことはじめ(Goに従う情報源)
注意: golang.jpは情報が更新されなくなっています。 古いものという前提で軽い参考程度になら良いかもしれない Goことはじめ(Goに従う情報源) Goことはじめ(Goに従う情報源)
IDEなど開発環境は…? ・一番有力なのはVScode ・年貢収めている人ならGoland、IntelliJ IDEA有料版 ・vimやemacsでもいける ・gopls使っていきましょう https://github.com/golang/go/wiki/gopls Goことはじめ(開発環境) Goことはじめ(Goに従う情報源)
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ
※コード例がいくつか出ますが、 一旦ざっくり把握してもらえれば良いです。 時間の都合上 色々説明が不足していますので、 雰囲気だけでも感じてください。 NOTE NOTE
err := hoge(); if err != nil { log.Error(err) }
Goってこんなコード ・if err != nil Goってこんなコード
err := hoge(); if err != nil { log.Error(err) }
Goってこんなコード ・if err != nil Goってこんなコード if err != nil でイディオムとして覚え て良いぐらい頻出
if err := hoge(); err != nil { log.Error(err) }
Goってこんなコード ・if err != nil Goってこんなコード または、ココでこう
if err := hoge(); err != nil { log.Error(err) }
Goってこんなコード ・if err != nil Goってこんなコード Exceptionない 例外機構ない err != nil、ただそれだけ
if err := hoge(); err != nil { log.Error(err) }
Goってこんなコード ・if err != nil Goってこんなコード pkg/errorsか xerrorsを使っていきましょう (今後は多分xerrors)
if err := hoge(); err != nil { log.Error(err) }
Goってこんなコード ・if err != nil Goってこんなコード errは関数の戻り値の 一番最後というキマリ↓ たとえば func makeStr() (string, error) 戻り値は多値に出来る
m := map[string]string{} m["a"] = "aaaa" fmt.Println(m) //-=> map[a:aaaa] Goってこんなコード
・map Goってこんなコード
m := map[string]string{} m["a"] = "aaaa" fmt.Println(m) //-=> map[a:aaaa] Goってこんなコード
・map Goってこんなコード 普通にマップです
if v, ok := m["a"]; ok { fmt.Printf("key=%v:value=%v", "a", v)
} Goってこんなコード ・map Goってこんなコード contains的なのは こうやる
hoges := []string{} hoges = append(hoges, “a”) hoges = append(hoges,
“b”) hoges = append(hoges, “c”) fmt.Println(hoges) // => [a, b, c] Goってこんなコード ・slice append Goってこんなコード
hoges := []string{} hoges = append(hoges, “a”) hoges = append(hoges,
“b”) hoges = append(hoges, “c”) fmt.Println(hoges) // => [a, b, c] Goってこんなコード ・slice append Goってこんなコード これがslice
hoges := []string{} hoges = append(hoges, “a”) hoges = append(hoges,
“b”) hoges = append(hoges, “c”) fmt.Println(hoges) // => [a, b, c] Goってこんなコード ・slice append Goってこんなコード append….append...ap pend…..
hoges := []string{} hoges = append(hoges, “a”) hoges = append(hoges,
“b”) hoges = append(hoges, “c”) fmt.Println(hoges) // => [a, b, c] Goってこんなコード ・slice append Goってこんなコード sliceはざっくりいうと 可変配列のようなもの 配列を使った方が良い場合もあり。 カジュアルにappendしまくると計算量に よっては…(ご利用は計画的に)
for _, hoge := range hoges { fmt.Print(hoge) } //
=> a b c Goってこんなコード ・range Goってこんなコード
for _, hoge := range hoges { fmt.Print(hoge) } //
=> a b c Goってこんなコード ・range Goってこんなコード さっきのslice [a, b, c] です
for _, hoge := range hoges { fmt.Print(hoge) } //
=> a b c Goってこんなコード ・range Goってこんなコード rangeで添字と要素を取 得できる _ で添字は無視、要素 のみhogeに格納
for k, v := range m { fmt.Printf("key=%v:value=%v", k, v)
} // => key=a:value=aaaa Goってこんなコード ・range Goってこんなコード
for k, v := range m { fmt.Printf("key=%v:value=%v", k, v)
} // => key=a:value=aaaa Goってこんなコード ・range Goってこんなコード さっきのmapのmさん [a:aaaa] です
for k, v := range m { fmt.Printf("key=%v:value=%v", k, v)
} // => key=a:value=aaaa Goってこんなコード ・range Goってこんなコード mapのkeyとvalueを 格納できます
func deferSample() { defer fmt.Print("a") fmt.Print("b") fmt.Print("c") } // =>
b c a Goってこんなコード ・defer Goってこんなコード
func deferSample() { defer fmt.Print("a") fmt.Print("b") fmt.Print("c") } // =>
b c a Goってこんなコード ・defer Goってこんなコード Javaで言うところのfinally deferでclose処理とかしたりする
func highOrderFunc( beforeFunc func(), action func()) { beforeFunc() action() }
Goってこんなコード ・高階関数 Goってこんなコード
highOrderFunc( func() { fmt.Print("前処理") }, func() { fmt.Print("処理実行") }, )
// => 前処理 処理実行 Goってこんなコード ・高階関数 Goってこんなコード
highOrderFunc( func() { fmt.Print("前処理") }, func() { fmt.Print("処理実行") }, )
// => 前処理 処理実行 Goってこんなコード ・高階関数 Goってこんなコード AOP的なことをやったりとか。 middlewareという 呼ばれ方が多い印象
Goってこんなコード Goってこんなコード for _, sut := range []struct { value
string description string }{ {value: "1", description: "1です"}, {value: "2", description: "2です"}, {value: "3", description: "3です"}, } { if !isNumeric(sut.value) { t.Errorf("expected number , but actual %s. test case :%s", sut.value, sut.description) } } ・テーブルドリブンテスト
・テーブルドリブンテスト Goってこんなコード Goってこんなコード for _, sut := range []struct {
value string description string }{ {value: "1", description: "1です"}, {value: "2", description: "2です"}, {value: "3", description: "3です"}, } { if !isNumeric(sut.value) { t.Errorf("expected number , but actual %s. test case :%s", sut.value, sut.description) } } testケースをガッとまとめて (語彙力)
・テーブルドリブンテスト Goってこんなコード Goってこんなコード for _, sut := range []struct {
value string description string }{ {value: "1", description: "1です"}, {value: "2", description: "2です"}, {value: "3", description: "3です"}, } { if !isNumeric(sut.value) { t.Errorf("expected number , but actual %s. test case :%s", sut.value, sut.description) } } ビャッと検証 (語彙力)
Goってこんなコード ・goルーチン(めっちゃ雑) Goってこんなコード func job() { // よくあるjob処理 fmt.Println("job Start...")
defer func() { fmt.Println("job End...") }() }
Goってこんなコード ・goルーチン(めっちゃ雑) Goってこんなコード func main() { go job() // goルーチン
// server起動処理など... // ... } goルーチン使ってjobを実行させ たりとかする
雑すぎてgoルーチン伝わるわけねえ! Go Concurrency Patterns でぜひググってください(再掲) https://talks.golang.org/2012/concurrenc y.slide#1
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ
yy_yankさんへ 時計を一旦見てね ここで25分経過ぐらいだと嬉しい (自分へのメッセージ)
巻いていこう
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ
・Goはクロスプラットフォーム(win,mac,linux) ・色んなOS向けにバイナリを吐ける ・GOOSオプションでOSを指定、GOARCHオプションでアーキテ クチャを指定するだけでその環境向けの実行可能バイナリを生成 Goの特徴(クロスコンパイル) Goの特徴(クロスコンパイル)
package main import "fmt" func main() { fmt.Printf("Hello world\n") }
Goの特徴(クロスコンパイル) ・hello worldやっときましょうか Goの特徴(クロスコンパイル)
・helloアプリケーションとかあるとすると、、 GOOS=linux GOARCH=amd64 go build hello.go GOOS=darwin GOARCH=amd64 go build
hello.go GOOS=windows GOARCH=amd64 go build hello.go これを各OSの人たちに配ればOK Goの特徴(クロスコンパイル) Goの特徴(クロスコンパイル)
・GoにはGCがある ・トリコロールマーク&スイープGC ・なんですけど、まぁ本セッションでは割愛 ・GoはC/C++的なレイヤーに近いように思いますが GCあるのでメモリ管理は不要 Goの特徴(GC) Goの特徴(GC)
・GoにはGCがある ・トリコロールマーク&スイープGC ・なんですけど、まぁ本セッションでは割愛 ・GoはC/C++的なレイヤーに近いように思いますが GCあるのでメモリ管理は不要 Goの特徴(GC) Goの特徴(GC) GCある! Javaと一緒! 実質Java!
(出典:カロリーゼロ理論)
・Goは静的型付き ・Goには基本型と構造体がある ・ポインタもある ・interfaceもある ・速度速くて静的型がある、(僕は)嬉しい Goの特徴(言語仕様) Goの特徴(言語仕様)
・Goは静的型付き ・Goには基本型と構造体がある ・ポインタもある ・interfaceもある Goの特徴(言語仕様) Goの特徴(言語仕様) 基本型: bool、string、int int8 int16
int32 int64、uint uint8 uint16 uint32 uint64、uintptr、byte、rune、 float32 float64、complex64 complex128
・Goは静的型付き ・Goには基本型と構造体がある ・ポインタもある ・interfaceもある Goの特徴(言語仕様) Goの特徴(言語仕様) 構造体: type Hoge struct
{ a string b int }
・Goは静的型付き ・Goには基本型と構造体がある ・ポインタもある ・interfaceもある Goの特徴(言語仕様) Goの特徴(言語仕様) ポインタ: var a *string
b := “b” a = &b
・Goは静的型付き ・Goには基本型と構造体がある ・ポインタもある Goの特徴(言語仕様) Goの特徴(言語仕様) type Hoge interface { Get()
string Set(string) }
・フォーマットで争わなくて済む→gofmtです ・あと、未使用の変数やimportがあるとコンパイルエラーという優 しさ ・Javaもgoogle/google-java-formatとかかけておけば良いと思 うんです Goの特徴(言語仕様) Goの特徴(言語仕様)
・サーバー/クライアントがある(net/httpパッケージ) ・jsonも扱える(encoding/jsonパッケージ) ・ユニットテスト(testingパッケージ) ・winでもちゃんと動くpath/filepathパッケージ Goの特徴(言語仕様) Goの特徴(標準package)
・ライブラリの追加が簡単 go get hoge/fuga Goの特徴(ライブラリ追加、依存管理) githubとかに公開しておけば go getとかすぐ出来る感じ Goの特徴(コマンドライブラリ追加理)
・ライブラリの追加が簡単 go get hoge/fuga Goの特徴(ライブラリ追加、依存管理) CUIツールとか配布しやすい。peco とか Goの特徴(コマンドライブラリ追加理)
・誰が書いても同じようなコードになる(?) ・Goは本当に簡単か→それなりに難しい。平易に読みやすいが書 くのはまぁまぁ難しい Goの特徴(Goは簡単か?という話) 読むには読めるけど、 サッと書くには慣れが必要 Goの特徴(Goは簡単か?という話) Goの特徴(誰が書いても同じコード?)
・メソッド名、変数名は略す ・小文字がprivate、大文字がpublic ・スコープはpackage単位、レシーバー単位 ・レシーバーとなり得るのはpackageか構造体など Goの特徴(Javaと違うとこ) Goの特徴(Javaと違うとこ)
・メソッド名、変数名は略す ・小文字がprivate、大文字がpublic ・スコープはpackage単位、レシーバー単位 ・レシーバーとなり得るのはpackageか構造体など Goの特徴(Javaと違うとこ) 大体go vetとかgolintが教えてくれ るはず Goの特徴(Javaと違うとこ)
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ
yy_yankさんへ 落ち着いてもう一度時計を見てね ここで35分ぐらい経過だと嬉しい (自分へのメッセージ再び)
巻いていこう
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ
・クラスが無いけどどうすりゃええの →structとかにメソッドはやす →ディレクトリ掘ってpackage作るファイル作る (むやみに作るのはダメ、ゼッタイ。) Goを使ってみる(ビルド、コーディング編) Go使いはじめ(ビルド、コーディング編)
・クラスが無いけどどうすりゃええの →type定義やstructにメソッドはやす →ディレクトリ掘ってpackage作るファイル作る (むやみに作るのはダメ、ゼッタイ。) Goを使ってみる(ビルド、コーディング編) Go使いはじめ(ビルド、コーディング編) package構成に唯一解はないけど、宗 派はいくつかある 割とみんな悩みながらやってたり割り 切ってたりするらしい
・クラスが無いけどどうすりゃええの →type定義やstructにメソッドはやす →ディレクトリ掘ってpackage作るファイル作る (むやみに作るのはダメ、ゼッタイ。) Goを使ってみる(ビルド、コーディング編) Go使いはじめ(ビルド、コーディング編) 個人的には 自動生成系 + FW系
+ 自前package で考えながら育てていくのが 良いかなとか
・クラスが無いけどどうすりゃええの →type定義やstructにメソッドはやす →ディレクトリ掘ってpackage作るファイル作る (むやみに作るのはダメ、ゼッタイ。) Goを使ってみる(ビルド、コーディング編) Go使いはじめ(ビルド、コーディング編) ばっきばきにレイヤードアーキテクチャ とかそういうのやるなら多分Javaの方 がやりやすい (Goで出来ないわけではないが…)
・ボイラープレートが増える?コード量が増える? →冗長さはあるけど、結局書く人次第。 それ他の言語でも同じなのでは(自戒) Goを使ってみる(ビルド、コーディング編) Go使いはじめ(ビルド、コーディング編)
ベンダリング ・go module一択になっていくと思われ ビルド ・普通にgo runとかgo buildが良いと思われ Goを使ってみる(ビルド、コーディング編) Go使いはじめ(ビルド、コーディング編)
・Javaで言うところのアレ、ある? ・そこに無かったらないですね ・ないものはない!Javaのことは忘れるんだ ※あるものはあります Javaで言うとこのアレ、ある? Go使いはじめ(Javaで言うところのアレ、ある?)
・文字列操作 stringsパッケージ、substring的なもの = rune ・文字列←→数値 strconv, fmt.Sprint ・文字列フォーマット fmt ・ソート
sortパッケージ ・ファイルの読み書き ioutilパッケージ Javaで言うとこのアレ、ある? Go使いはじめ(Javaで言うところのアレ、ある?)
・Goやってて欲しくなる→強めのコレクションフレームワーク (anyMatch, filter,map,flatMap,reduce,contains的なもの) 解決法:共通化したり、スニペットとかでガッと書く。 filter欲しいなぁ、、、って考えてる暇に書く。 これは慣れでなんとかなる。 Goやってて欲しくなるもの Go使いはじめ(Goやってて欲しくなるもの)
・Goやってて欲しくなる→強めのコレクションフレームワーク (anyMatch, filter,map,flatMap,reduce,contains的なもの) 解決法:またはgo generateを使う gen: slice typewriter とか https://clipperhouse.com/gen/slice/
Goやってて欲しくなるもの Go使いはじめ(Goやってて欲しくなるもの)
・Goやってて若干欲しくなる→テスティングライブラリ ・Goとしては、あんまりテスティングライブラリとか使わず、標準の ものだけ使ってシンプルなものに保てみたいな方針だった記憶 Goやってて欲しくなるもの Go使いはじめ(Goやってて欲しくなるもの)
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ
・Goでハマったとこ超初期→forのイディオム覚えられない ・for hoge := range hoges {...} とかやってしまう Goを使ってハマった編 Goを使ってハマった編
覚えるしかない!rangeで何が取得でき るのか覚えるのに地味に苦労した
・循環依存 import cycle not allowed Goを使ってハマった編 Goを使ってハマった編 package Aでpackage Bをimport
package Bでpackage Aをimport しちゃダメよ。
・Goでハマったとこ→slice作りすぎて爆死 むやみにループまわして無邪気にslice生成しまくると メモリが足りなくなるよ。しょぼいサーバーとか Goを使ってハマった編 Goを使ってハマった編
・Goでハマったとこ→ログ吐いたらプロセス落ちるやん ・log.Fatalはos.Exitを呼んでいる ・カジュアルに使ってはいけない ・panicもカジュアルに使ってはいけない Goを使ってハマった編 Goを使ってハマった編
・GoだったらJavaだったら…という大きな違いは処理面で出にく い。Goは並列処理は楽に安全にわりかし走らせやすい ・どこが問題になりやすいかといえば、結局外部サービス、DB、 IOなど。これはどの言語でもだと思う Goを使ってハマった編 Goを使ってハマった編
・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダ アジェンダ
・Goで手軽にマシンに優しいものが作れる ・Goに従えば手段が1つ増える ・アプリケーションを堅実に作れる ・並行処理も便利に使える まとめ まとめ
・Next Stepとなる更なる情報はgolang.tokyoやGo Conference など ・あなた自身がgopherになることで手に入ります! (丸投げ) まとめ まとめ
大事な手札を増やしていきましょう。 ありがとうございました。
これ以降のスライドは 時間の都合などで 発表ではカットしたものです
・go製の便利コマンド(個人的な好みによるリストアップ) peco https://github.com/peco/peco fzf https://github.com/junegunn/fzf ghq https://github.com/motemen/ghq docui https://github.com/skanehira/docui ctop
https://github.com/bcicen/ctop lf https://github.com/gokcehan/lf まとめ ボツネタ
・Go用ゲームライブラリ https://github.com/hajimehoshi/ebiten ・GUI https://github.com/avelino/awesome-go#gui ・Android/iOS開発はgo mobileで https://github.com/golang/go/wiki/Mobile ・gopherjs https://github.com/gopherjs/gopherjs まとめ
ボツネタ
・Goで作られているサービス docker、k8s、istio、terraform、drone、prometheus などなどたくさん http://namaristats.com/langs/Go ・Goは誰が使っている? https://github.com/golang/go/wiki/GoUsers (あ、弊社も使ってますよ!) まとめ ボツネタ
・TUIライブラリまとめ https://appliedgo.net/tui/ tviewとか結構いいらしいです https://github.com/rivo/tview まとめ ボツネタ
・GoのDIコンテナ wireやdigがあるが、それほどリッチではなさそう ・ORMのベンチマーク https://github.com/mattn/orm-benchmark まとめ ボツネタ
・ORM ORMのベンチマーク https://github.com/mattn/orm-benchmark awesome go ORM https://github.com/avelino/awesome-go#orm まとめ ボツネタ
・validator go-playground/validator が流行ってる? awesome-go validation https://github.com/avelino/awesome-go#validation まとめ ボツネタ
・ロガー zap流行ってる? zap https://github.com/uber-go/zap awesome go logging https://github.com/avelino/awesome-go#logging まとめ ボツネタ
・test系ライブラリ mock https://github.com/golang/mock assertライブラリ https://github.com/stretchr/testify カバレッジとってリッチな画面でみたいライブラリ https://github.com/smartystreets/goconvey awesome go testing
https://github.com/avelino/awesome-go#testing まとめ ボツネタ
・lint系やコーディング補助系ツール errcheck(errチェック漏れ検知) https://github.com/kisielk/errcheck fillstruct(struct生成) https://github.com/davidrjenni/reftools/cmd/fillstruct goimports(自動import) https://godoc.org/golang.org/x/tools/cmd/goimports gomodifytags(structタグ生成) https://github.com/fatih/gomodifytags keyify
https://github.com/dominikh/go-tools/tree/master/cmd/keyify まとめ ボツネタ
・lint系やコーディング補助系ツール iferrチェック https://github.com/koron/iferr gocycro(循環複雑度チェック) https://github.com/fzipp/gocyclo dupl(重複コードチェック) https://github.com/mibk/dupl 全部チェックしちゃうlinter https://github.com/golangci/golangci-lint まとめ
ボツネタ
・LSP(Language Server Protocol) LSP仕様 https://github.com/Microsoft/language-server-protocol gopls一択の状況(旧名golsp)。 gopls のuser guide https://github.com/golang/tools/blob/master/gopls/doc/user.md
goplsの他にbingoというのがあったが開発を止めてしまった … https://github.com/saibing/bingo gocodeも愛用されたがもう開発stop。。詳しくは https://mattn.kaoriya.net/software/lang/go/20181217000056.htm golang-serverも中身はgocodeらしいので…という話 まとめ ボツネタ
・エディタプラグイン(emacs) go-mode https://github.com/dominikh/go-mode.el go-eldoc https://github.com/syohex/emacs-go-eldoc lsp-mode https://github.com/emacs-lsp/lsp-mode まとめ ボツネタ
・エディタプラグイン(vim) vim-go https://github.com/fatih/vim-go gopher vim https://github.com/arp242/gopher.vim vim-lsp https://github.com/prabirshrestha/vim-lsp まとめ ボツネタ
・Goのレイヤー分割のしんどいところ 循環依存 import cycle not allowed リッチなDIコンテナが無い フレームワークとかがプロジェクトによってマチマチ(それは自然)。その中で統 一した構成は結構難しいかもしれないという まとめ
ボツネタ
・業務アプリケーションの package構成について(個人的感覚) docker、k8s、istio、terraform、drone、prometheus などなどありますが 多分それをそのまま真似てもうまくいかない。 どういう方針でも自分たち考えて徐々に育てていくことが大事。 OSSのライブラリや SaaSとかIaaS的なものを作っている場合は真似しても良い気がするが、 実際自分たちが作っているのは何なのか …というところ。
レイヤー分割バリバリするようなホニャララアーキテクチャも結構 Goは向いていない。 (かといってそれを実践している人たちを批判したいわけでもない )。 自動生成は受け入れやすいので自動生成系とフレームワークのルールに従う。 ライブラリを掛け合わせて最適化していくのが良いのかなと思いますが、 誰かの言葉を借りてそれを答えだと思わないで欲しいのでこれも答えではありません。 まとめ ボツネタ
自分の知識不足による誤りなどあれば教 えていただけると幸いです。 適宜、資料修正します。 連絡先 twitter @yy_yank