Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Javaプログラマのための頑張らないGo入門

2,540 views

Published on

JJUG CCC Fall 2019の資料です

Published in: Software
  • Be the first to comment

Javaプログラマのための頑張らないGo入門

  1. 1. Javaプログラマのための 頑張らないGo入門 JJUG CCC 2019 Fall #ccc_g2 #jjug_ccc @yy_yank
  2. 2. #ccc_g2 #jjug_ccc でつぶやいてください ハッシュタグ TODOハッシュタグ
  3. 3. 自己紹介 やんく(@yy_yank) こいつです ・(株)Abbyのプログラマ ・JJUG CCC登壇4回目? ・iconはsakuraエディタなのに ・vim使う ・Java,Kotlin,Goが好き
  4. 4. 「あれ、JavaのカンファレンスでGoの話するの か?するのか。いいのか?」
 採用されて我に返った僕

  5. 5. 頑張らないって
 タイトルにしたけど
 頑張っていきましょう

  6. 6. でもGoを知る近道にはな るかも?

  7. 7. というセッション
 (にしたい)

  8. 8. このセッションは Goを知り興味を持つきっかけ という位置付けです。 Goを深く学びたい方向けではありません。 NOTENOTE
  9. 9. ・このセッションは個人の感想です。所属企業のうん ぬんかんぬんではありません。 ・ワタシJavaスキ ・ワタシGoもスキ ・言語がスキ NOTE
  10. 10. ・もちろん主観はありますが、それぞれの言語に対し てフェアに ・良いところを伝えていければ ・Javaの話ほとんどないです NOTENOTE
  11. 11. ・Goってあれでしょ?電車でGoだよね ・なんかGoっていう言語があるらしい ・Go気になるのでちょっととっかかりが欲しい ぐらいの人 ここにいる人の想定
  12. 12. ・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダアジェンダ
  13. 13. ・イントロダクション(僕の思うGoとJava) 冒頭から含めて15分 ・Goことはじめ 7分 ・Goってこんなコード 9分 ・Goの特徴 10分 ・Go使いはじめ(yy_yank目線) 4.5分 ・Goを使ってハマった編(yy_yank目線) 2分 ・まとめ 0.5分 アジェンダ発表練習時 RTA(Real Time Attack)の結果です
  14. 14. ・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダアジェンダ
  15. 15. ・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダアジェンダ イントロダクションという名の 言いたいこと先に言っとくやつ
  16. 16. 「GoとJavaを並べるのは筋が悪い」
 架空の人:

  17. 17. 「わかる」
 ぼく:

  18. 18. ・JavaとGoを比べるのは筋が悪い(と思う) ・Javaならこう出来る…を捨てる ・しかし、言語に対してフェアに ・他の言語を知ってると、Goを一通り触らないと良い言語には感じ ないのではと思う(食わず嫌い的な) →なんかWebアプリでも作ってみて欲しい イントロダクション(僕の思うGoとJava)
  19. 19. ・すべてを忘れてGoを書いてみるとジワジワ良さを感じてくる(効 果には個人差があります) ・なんか物足りねえけどなんとかなるなぁみたいな ・ほーいいじゃないか、こういうのでいいんだよこういうので(出典: 孤独のグルメ) イントロダクションイントロダクション(僕の思うGoとJava)
  20. 20. ・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクションイントロダクション(僕の思うGoとJava)
  21. 21. ・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクションイントロダクション(僕の思うGoとJava) goルーチンはすげえ軽い。Javaの スレッドは1スレッド固定長1MB(デ フォルト)、goルーチンは4KBの動的 割り当て
  22. 22. ・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/
  23. 23. ・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクションイントロダクション(僕の思うGoとJava) graalあたりで頑張るで! (今後数年が楽しみ)
  24. 24. ・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクションイントロダクション(僕の思うGoとJava) channelでmessage passingがとて も楽。そしていろんなパターンが出 来る
  25. 25. ・Goはコンパイルが速くメモリを食いにくい →開発(者)に優しい ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち →開発(者)に優しいかもしれないけど、 メモリには厳しい イントロダクションイントロダクション(僕の思うGoとJava) Go Concurrency Patterns で検索 https://talks.golang.org/2012/c oncurrency.slide#1
  26. 26. ・Javaで作れるものは割とGoで作れる(別に低レイヤーのみでも ない) ・しかしJavaのようにGoを書こうとするとこじれる ・GoらしくGoを書くのが良い →だがそれが難しい(業務で感じたところ←今ココ) イントロダクションイントロダクション(僕の思うGoとJava)
  27. 27. ・Javaで作れるものは割とGoで作れる(別に低レイヤーのみでも ない) ・しかしJavaのようにGoを書こうとするとこじれる ・GoらしくGoを書くのが良い →だがそれが難しい イントロダクションイントロダクション(僕の思うGoとJava) Goの方が得意そうなのはTUI、 CLI(コマンド)系、並行処理(記述が 簡単という意味では)
  28. 28. ・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
  29. 29. ・JavaもGoも開発のための手段 ・手段だけどプログラマにとって大事なもの、選べる手段は多い方 が良い ・GoはJavaの代替にもなるし、Javaでは扱いにくい部分も対応出 来る(TUIやCUIなど) ・メモリ食いにくいので手軽 イントロダクションイントロダクション(僕の思うGoとJava)
  30. 30. ・JavaもGoも開発のための手段 ・手段だけどプログラマにとって大事な道具、選べる道具は多い 方が良い ・GoはJavaの代替にもなるし、Javaでは扱いにくい部分も対応出 来る(TUIやCUIなど) ・メモリ食いにくいので手軽 イントロダクションイントロダクション(僕の思うGoとJava) 手札を増やしてみませんか? というのがJavaプログラマへ僕か ら出来るGoのススメ (Java好きの人はJavaがとても好きなの知ってるけど )
  31. 31. ・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダアジェンダ
  32. 32. ・言い尽くされているがGoに入ればGoに従え Goの目指しているところを知って、それに乗れば自然とうまくいく はず ・Goは素直なようでクセがある GoことはじめGoことはじめ
  33. 33. Go言語の初心者が見ると幸せになれる場所 #golang https://qiita.com/tenntenn/items/0e33a4959250d1a5504 5 Goことはじめ(Goに従う情報源) 迷える人にオススメ Goことはじめ(Goに従う情報源)
  34. 34. A Tour of Go http://go-tour-jp.appspot.com/#1 Goことはじめ(Goに従う情報源) ササッと触ってみたい 人向け Goことはじめ(Goに従う情報源)
  35. 35. Frequently Asked Questions (FAQ) https://golang.org/doc/faq Goことはじめ(Goに従う情報源) 色々気になることが 多い人向け Goことはじめ(Goに従う情報源)
  36. 36. みんなのGo言語 Goことはじめ(Goに従う情報源) 実用的な軽めの本読みたい人向け パラパラ漫画したい人向け Goことはじめ(Goに従う情報源)
  37. 37. プログラミング言語Go(がっつり言語仕様知りたい人) Go言語による並行処理(goルーチンあたり知りたい人) Goならわかるシステムプログラミング(良い本) Goことはじめ(Goに従う情報源) しっかり 本読みたい人向け Goことはじめ(Goに従う情報源)
  38. 38. Effective Go https://golang.org/doc/effective_go.html Goことはじめ(Goに従う情報源) Go書いてて指針が 欲しい人向け Goことはじめ(Goに従う情報源)
  39. 39. Go Patterns http://tmrts.com/go-patterns/ Goことはじめ(Goに従う情報源) builderパターンとか Functional Optionとか たまに便利 Goことはじめ(Goに従う情報源)
  40. 40. Standard Go Project Layout https://github.com/golang-standards/project-layout Goことはじめ(Goに従う情報源) 名前に困ったら。 あくまで参考程度に Goことはじめ(Goに従う情報源)
  41. 41. Awesome Go https://awesome-go.com/ Goことはじめ(Goに従う情報源) イケてるライブラリを 使おう(ご利用は計画的に) Goことはじめ(Goに従う情報源)
  42. 42. uber-go/guide https://github.com/uber-go/guide Goことはじめ(Goに従う情報源) 最近話題になってました。参 考程度に Goことはじめ(Goに従う情報源)
  43. 43. 注意: golang.jpは情報が更新されなくなっています。 古いものという前提で軽い参考程度になら良いかもしれない Goことはじめ(Goに従う情報源)Goことはじめ(Goに従う情報源)
  44. 44. IDEなど開発環境は…? ・一番有力なのはVScode ・年貢収めている人ならGoland、IntelliJ IDEA有料版 ・vimやemacsでもいける ・gopls使っていきましょう https://github.com/golang/go/wiki/gopls Goことはじめ(開発環境)Goことはじめ(Goに従う情報源)
  45. 45. ・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダアジェンダ
  46. 46. ※コード例がいくつか出ますが、 一旦ざっくり把握してもらえれば良いです。 時間の都合上 色々説明が不足していますので、 雰囲気だけでも感じてください。 NOTENOTE
  47. 47. err := hoge(); if err != nil { log.Error(err) } Goってこんなコード ・if err != nil Goってこんなコード
  48. 48. err := hoge(); if err != nil { log.Error(err) } Goってこんなコード ・if err != nil Goってこんなコード if err != nil でイディオムとして覚え て良いぐらい頻出
  49. 49. if err := hoge(); err != nil { log.Error(err) } Goってこんなコード ・if err != nil Goってこんなコードまたは、ココでこう
  50. 50. if err := hoge(); err != nil { log.Error(err) } Goってこんなコード ・if err != nil Goってこんなコード Exceptionない 例外機構ない err != nil、ただそれだけ
  51. 51. if err := hoge(); err != nil { log.Error(err) } Goってこんなコード ・if err != nil Goってこんなコード pkg/errorsか xerrorsを使っていきましょう (今後は多分xerrors)
  52. 52. if err := hoge(); err != nil { log.Error(err) } Goってこんなコード ・if err != nil Goってこんなコード errは関数の戻り値の 一番最後というキマリ↓ たとえば func makeStr() (string, error) 戻り値は多値に出来る
  53. 53. m := map[string]string{} m["a"] = "aaaa" fmt.Println(m) //-=> map[a:aaaa] Goってこんなコード ・map Goってこんなコード
  54. 54. m := map[string]string{} m["a"] = "aaaa" fmt.Println(m) //-=> map[a:aaaa] Goってこんなコード ・map Goってこんなコード 普通にマップです
  55. 55. if v, ok := m["a"]; ok { fmt.Printf("key=%v:value=%v", "a", v) } Goってこんなコード ・map Goってこんなコード contains的なのは こうやる
  56. 56. hoges := []string{} hoges = append(hoges, “a”) hoges = append(hoges, “b”) hoges = append(hoges, “c”) fmt.Println(hoges) // => [a, b, c] Goってこんなコード ・slice append Goってこんなコード
  57. 57. 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
  58. 58. 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…..
  59. 59. 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しまくると計算量に よっては…(ご利用は計画的に)
  60. 60. for _, hoge := range hoges { fmt.Print(hoge) } // => a b c Goってこんなコード ・range Goってこんなコード
  61. 61. for _, hoge := range hoges { fmt.Print(hoge) } // => a b c Goってこんなコード ・range Goってこんなコード さっきのslice [a, b, c] です
  62. 62. for _, hoge := range hoges { fmt.Print(hoge) } // => a b c Goってこんなコード ・range Goってこんなコード rangeで添字と要素を取 得できる _ で添字は無視、要素 のみhogeに格納
  63. 63. for k, v := range m { fmt.Printf("key=%v:value=%v", k, v) } // => key=a:value=aaaa Goってこんなコード ・range Goってこんなコード
  64. 64. for k, v := range m { fmt.Printf("key=%v:value=%v", k, v) } // => key=a:value=aaaa Goってこんなコード ・range Goってこんなコード さっきのmapのmさん [a:aaaa] です
  65. 65. for k, v := range m { fmt.Printf("key=%v:value=%v", k, v) } // => key=a:value=aaaa Goってこんなコード ・range Goってこんなコード mapのkeyとvalueを 格納できます
  66. 66. func deferSample() { defer fmt.Print("a") fmt.Print("b") fmt.Print("c") } // => b c a Goってこんなコード ・defer Goってこんなコード
  67. 67. func deferSample() { defer fmt.Print("a") fmt.Print("b") fmt.Print("c") } // => b c a Goってこんなコード ・defer Goってこんなコード Javaで言うところのfinally deferでclose処理とかしたりする
  68. 68. func highOrderFunc( beforeFunc func(), action func()) { beforeFunc() action() } Goってこんなコード ・高階関数 Goってこんなコード
  69. 69. highOrderFunc( func() { fmt.Print("前処理") }, func() { fmt.Print("処理実行") }, ) // => 前処理 処理実行 Goってこんなコード ・高階関数 Goってこんなコード
  70. 70. highOrderFunc( func() { fmt.Print("前処理") }, func() { fmt.Print("処理実行") }, ) // => 前処理 処理実行 Goってこんなコード ・高階関数 Goってこんなコード AOP的なことをやったりとか。 middlewareという 呼ばれ方が多い印象
  71. 71. 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) } } ・テーブルドリブンテスト
  72. 72. ・テーブルドリブンテスト 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ケースをガッとまとめて (語彙力)
  73. 73. ・テーブルドリブンテスト 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) } } ビャッと検証 (語彙力)
  74. 74. Goってこんなコード ・goルーチン(めっちゃ雑) Goってこんなコード func job() { // よくあるjob処理 fmt.Println("job Start...") defer func() { fmt.Println("job End...") }() }
  75. 75. Goってこんなコード ・goルーチン(めっちゃ雑) Goってこんなコード func main() { go job() // goルーチン // server起動処理など... // ... } goルーチン使ってjobを実行させ たりとかする
  76. 76. 雑すぎてgoルーチン伝わるわけねえ!
 Go Concurrency Patterns
 でぜひググってください(再掲)
 https://talks.golang.org/2012/concurrenc y.slide#1
 

  77. 77. ・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダアジェンダ
  78. 78. ・Goはクロスプラットフォーム(win,mac,linux) ・色んなOS向けにバイナリを吐ける ・GOOSオプションでOSを指定、GOARCHオプションでアーキテ クチャを指定するだけでその環境向けの実行可能バイナリを生成 Goの特徴(クロスコンパイル)Goの特徴(クロスコンパイル)
  79. 79. package main import "fmt" func main() { fmt.Printf("Hello worldn") } Goの特徴(クロスコンパイル) ・hello worldやっときましょうか Goの特徴(クロスコンパイル)
  80. 80. ・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の特徴(クロスコンパイル)
  81. 81. ・GoにはGCがある ・トリコロールマーク&スイープGC ・なんですけど、まぁ本セッションでは割愛 ・GoはC/C++的なレイヤーに近いように思いますが GCあるのでメモリ管理は不要 Goの特徴(GC)Goの特徴(GC)
  82. 82. ・GoにはGCがある ・トリコロールマーク&スイープGC ・なんですけど、まぁ本セッションでは割愛 ・GoはC/C++的なレイヤーに近いように思いますが GCあるのでメモリ管理は不要 Goの特徴(GC)Goの特徴(GC) GCある! Javaと一緒! 実質Java! (出典:カロリーゼロ理論)
  83. 83. ・Goは静的型付き ・Goには基本型と構造体がある ・ポインタもある ・interfaceもある ・速度速くて静的型がある、(僕は)嬉しい Goの特徴(言語仕様)Goの特徴(言語仕様)
  84. 84. ・Goは静的型付き ・Goには基本型と構造体がある ・ポインタもある ・interfaceもある Goの特徴(言語仕様)Goの特徴(言語仕様) 基本型: bool、string、int int8 int16 int32 int64、uint uint8 uint16 uint32 uint64、uintptr、byte、rune、 float32 float64、complex64 complex128
  85. 85. ・Goは静的型付き ・Goには基本型と構造体がある ・ポインタもある ・interfaceもある Goの特徴(言語仕様)Goの特徴(言語仕様) 構造体: type Hoge struct { a string b int }
  86. 86. ・Goは静的型付き ・Goには基本型と構造体がある ・ポインタもある ・interfaceもある Goの特徴(言語仕様)Goの特徴(言語仕様) ポインタ: var a *string b := “b” a = &b
  87. 87. ・Goは静的型付き ・Goには基本型と構造体がある ・ポインタもある Goの特徴(言語仕様)Goの特徴(言語仕様) type Hoge interface { Get() string Set(string) }
  88. 88. ・フォーマットで争わなくて済む→gofmtです ・あと、未使用の変数やimportがあるとコンパイルエラーという優 しさ ・Javaもgoogle/google-java-formatとかかけておけば良いと思 うんです Goの特徴(言語仕様)Goの特徴(言語仕様)
  89. 89. ・サーバー/クライアントがある(net/httpパッケージ) ・jsonも扱える(encoding/jsonパッケージ) ・ユニットテスト(testingパッケージ) ・winでもちゃんと動くpath/filepathパッケージ Goの特徴(言語仕様)Goの特徴(標準package)
  90. 90. ・ライブラリの追加が簡単 go get hoge/fuga Goの特徴(ライブラリ追加、依存管理) githubとかに公開しておけば go getとかすぐ出来る感じ Goの特徴(コマンドライブラリ追加理)
  91. 91. ・ライブラリの追加が簡単 go get hoge/fuga Goの特徴(ライブラリ追加、依存管理) CUIツールとか配布しやすい。peco とか Goの特徴(コマンドライブラリ追加理)
  92. 92. ・誰が書いても同じようなコードになる(?) ・Goは本当に簡単か→それなりに難しい。平易に読みやすいが書 くのはまぁまぁ難しい Goの特徴(Goは簡単か?という話) 読むには読めるけど、 サッと書くには慣れが必要 Goの特徴(Goは簡単か?という話)Goの特徴(誰が書いても同じコード?)
  93. 93. ・メソッド名、変数名は略す ・小文字がprivate、大文字がpublic ・スコープはpackage単位、レシーバー単位 ・レシーバーとなり得るのはpackageか構造体など Goの特徴(Javaと違うとこ)Goの特徴(Javaと違うとこ)
  94. 94. ・メソッド名、変数名は略す ・小文字がprivate、大文字がpublic ・スコープはpackage単位、レシーバー単位 ・レシーバーとなり得るのはpackageか構造体など Goの特徴(Javaと違うとこ) 大体go vetとかgolintが教えてくれ るはず Goの特徴(Javaと違うとこ)
  95. 95. ・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダアジェンダ
  96. 96. ・クラスが無いけどどうすりゃええの →structとかにメソッドはやす →ディレクトリ掘ってpackage作るファイル作る (むやみに作るのはダメ、ゼッタイ。) Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編)
  97. 97. ・クラスが無いけどどうすりゃええの →type定義やstructにメソッドはやす →ディレクトリ掘ってpackage作るファイル作る (むやみに作るのはダメ、ゼッタイ。) Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編) package構成に唯一解はないけど、宗 派はいくつかある 割とみんな悩みながらやってたり割り 切ってたりするらしい
  98. 98. ・クラスが無いけどどうすりゃええの →type定義やstructにメソッドはやす →ディレクトリ掘ってpackage作るファイル作る (むやみに作るのはダメ、ゼッタイ。) Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編) 個人的には 自動生成系 + FW系 + 自前package で考えながら育てていくのが 良いかなとか
  99. 99. ・クラスが無いけどどうすりゃええの →type定義やstructにメソッドはやす →ディレクトリ掘ってpackage作るファイル作る (むやみに作るのはダメ、ゼッタイ。) Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編) ばっきばきにレイヤードアーキテクチャ とかそういうのやるなら多分Javaの方 がやりやすい (Goで出来ないわけではないが…)
  100. 100. ・ボイラープレートが増える?コード量が増える? →冗長さはあるけど、結局書く人次第。 それ他の言語でも同じなのでは(自戒) Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編)
  101. 101. ベンダリング ・go module一択になっていくと思われ ビルド ・普通にgo runとかgo buildが良いと思われ Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編)
  102. 102. ・Javaで言うところのアレ、ある? ・そこに無かったらないですね ・ないものはない!Javaのことは忘れるんだ ※あるものはあります Javaで言うとこのアレ、ある?Go使いはじめ(Javaで言うところのアレ、ある?)
  103. 103. ・文字列操作 stringsパッケージ、substring的なもの = rune ・文字列←→数値 strconv, fmt.Sprint ・文字列フォーマット fmt ・ソート sortパッケージ ・ファイルの読み書き ioutilパッケージ Javaで言うとこのアレ、ある?Go使いはじめ(Javaで言うところのアレ、ある?)
  104. 104. ・Goやってて欲しくなる→強めのコレクションフレームワーク (anyMatch, filter,map,flatMap,reduce,contains的なもの) 解決法:共通化したり、スニペットとかでガッと書く。 filter欲しいなぁ、、、って考えてる暇に書く。 これは慣れでなんとかなる。 Goやってて欲しくなるものGo使いはじめ(Goやってて欲しくなるもの)
  105. 105. ・Goやってて欲しくなる→強めのコレクションフレームワーク (anyMatch, filter,map,flatMap,reduce,contains的なもの) 解決法:またはgo generateを使う gen: slice typewriter とか https://clipperhouse.com/gen/slice/ Goやってて欲しくなるものGo使いはじめ(Goやってて欲しくなるもの)
  106. 106. ・Goやってて若干欲しくなる→テスティングライブラリ ・Goとしては、あんまりテスティングライブラリとか使わず、標準の ものだけ使ってシンプルなものに保てみたいな方針だった記憶 Goやってて欲しくなるものGo使いはじめ(Goやってて欲しくなるもの)
  107. 107. ・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダアジェンダ
  108. 108. ・Goでハマったとこ超初期→forのイディオム覚えられない ・for hoge := range hoges {...} とかやってしまう Goを使ってハマった編Goを使ってハマった編 覚えるしかない!rangeで何が取得でき るのか覚えるのに地味に苦労した
  109. 109. ・循環依存 import cycle not allowed Goを使ってハマった編Goを使ってハマった編 package Aでpackage Bをimport package Bでpackage Aをimport しちゃダメよ。
  110. 110. ・Goでハマったとこ→slice作りすぎて爆死 むやみにループまわして無邪気にslice生成しまくると メモリが足りなくなるよ。しょぼいサーバーとか Goを使ってハマった編Goを使ってハマった編
  111. 111. ・Goでハマったとこ→ログ吐いたらプロセス落ちるやん ・log.Fatalはos.Exitを呼んでいる ・カジュアルに使ってはいけない ・panicもカジュアルに使ってはいけない Goを使ってハマった編Goを使ってハマった編
  112. 112. ・GoだったらJavaだったら…という大きな違いは処理面で出にく い。Goは並列処理は楽に安全にわりかし走らせやすい ・どこが問題になりやすいかといえば、結局外部サービス、DB、 IOなど。これはどの言語でもだと思う Goを使ってハマった編Goを使ってハマった編
  113. 113. ・イントロダクション(僕の思うGoとJava) ・Goことはじめ ・Goってこんなコード ・Goの特徴 ・Go使いはじめ(yy_yank目線) ・Goを使ってハマった編(yy_yank目線) ・まとめ アジェンダアジェンダ
  114. 114. ・Goで手軽にマシンに優しいものが作れる ・Goに従えば手段が1つ増える ・アプリケーションを堅実に作れる ・並行処理も便利に使える まとめまとめ
  115. 115. ・Next Stepとなる更なる情報はgolang.tokyoやGo Conference など ・あなた自身がgopherになることで手に入ります! (丸投げ) まとめまとめ
  116. 116. 大事な手札を増やしていきましょう。
 ありがとうございました。

  117. 117. これ以降のスライドは
 時間の都合などで
 発表ではカットしたものです

  118. 118. ・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 まとめボツネタ
  119. 119. ・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 まとめボツネタ
  120. 120. ・Goで作られているサービス docker、k8s、istio、terraform、drone、prometheus などなどたくさん http://namaristats.com/langs/Go ・Goは誰が使っている? https://github.com/golang/go/wiki/GoUsers (あ、弊社も使ってますよ!) まとめボツネタ
  121. 121. ・TUIライブラリまとめ https://appliedgo.net/tui/ tviewとか結構いいらしいです https://github.com/rivo/tview まとめボツネタ
  122. 122. ・GoのDIコンテナ wireやdigがあるが、それほどリッチではなさそう ・ORMのベンチマーク https://github.com/mattn/orm-benchmark まとめボツネタ
  123. 123. ・ORM ORMのベンチマーク https://github.com/mattn/orm-benchmark awesome go ORM https://github.com/avelino/awesome-go#orm まとめボツネタ
  124. 124. ・validator go-playground/validator が流行ってる? awesome-go validation https://github.com/avelino/awesome-go#validation まとめボツネタ
  125. 125. ・ロガー zap流行ってる? zap https://github.com/uber-go/zap awesome go logging https://github.com/avelino/awesome-go#logging まとめボツネタ
  126. 126. ・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 まとめボツネタ
  127. 127. ・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 まとめボツネタ
  128. 128. ・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 まとめボツネタ
  129. 129. ・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らしいので…という話 まとめボツネタ
  130. 130. ・エディタプラグイン(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 まとめボツネタ
  131. 131. ・エディタプラグイン(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 まとめボツネタ
  132. 132. ・Goのレイヤー分割のしんどいところ 循環依存 import cycle not allowed リッチなDIコンテナが無い フレームワークとかがプロジェクトによってマチマチ(それは自然)。その中で統 一した構成は結構難しいかもしれないという まとめボツネタ
  133. 133. ・業務アプリケーションの package構成について(個人的感覚) docker、k8s、istio、terraform、drone、prometheus などなどありますが 多分それをそのまま真似てもうまくいかない。 どういう方針でも自分たち考えて徐々に育てていくことが大事。 OSSのライブラリや SaaSとかIaaS的なものを作っている場合は真似しても良い気がするが、 実際自分たちが作っているのは何なのか …というところ。 レイヤー分割バリバリするようなホニャララアーキテクチャも結構 Goは向いていない。 (かといってそれを実践している人たちを批判したいわけでもない )。 自動生成は受け入れやすいので自動生成系とフレームワークのルールに従う。 ライブラリを掛け合わせて最適化していくのが良いのかなと思いますが、 誰かの言葉を借りてそれを答えだと思わないで欲しいのでこれも答えではありません。 まとめボツネタ
  134. 134. 自分の知識不足による誤りなどあれば教 えていただけると幸いです。
 適宜、資料修正します。
 
 連絡先
 twitter @yy_yank


×