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

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

yy_yank
November 23, 2019

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

2019年にJJUG CCC 2019 Fall で発表したものです(SlideShareからお引越し)。

yy_yank

November 23, 2019
Tweet

More Decks by yy_yank

Other Decks in Programming

Transcript

  1. Javaプログラマのための
    頑張らないGo入門
    JJUG CCC 2019 Fall
    #ccc_g2 #jjug_ccc
    @yy_yank

    View full-size slide

  2. #ccc_g2 #jjug_ccc
    でつぶやいてください
    ハッシュタグ TODO
    ハッシュタグ

    View full-size slide

  3. 自己紹介
    やんく(@yy_yank) こいつです
    ・(株)Abbyのプログラマ
    ・JJUG CCC登壇4回目?
    ・iconはsakuraエディタなのに
    ・vim使う
    ・Java,Kotlin,Goが好き

    View full-size slide

  4. 「あれ、JavaのカンファレンスでGoの話するの
    か?するのか。いいのか?」

    採用されて我に返った僕


    View full-size slide

  5. 頑張らないって

    タイトルにしたけど

    頑張っていきましょう


    View full-size slide

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


    View full-size slide

  7. というセッション

    (にしたい)


    View full-size slide

  8. このセッションは
    Goを知り興味を持つきっかけ
    という位置付けです。
    Goを深く学びたい方向けではありません。
    NOTE
    NOTE

    View full-size slide

  9. ・このセッションは個人の感想です。所属企業のうん
    ぬんかんぬんではありません。
    ・ワタシJavaスキ
    ・ワタシGoもスキ
    ・言語がスキ
    NOTE

    View full-size slide

  10. ・もちろん主観はありますが、それぞれの言語に対し
    てフェアに
    ・良いところを伝えていければ
    ・Javaの話ほとんどないです
    NOTE
    NOTE

    View full-size slide

  11. ・Goってあれでしょ?電車でGoだよね
    ・なんかGoっていう言語があるらしい
    ・Go気になるのでちょっととっかかりが欲しい
    ぐらいの人
    ここにいる人の想定

    View full-size slide

  12. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ

    View full-size slide

  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)の結果です

    View full-size slide

  14. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ

    View full-size slide

  15. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ
    イントロダクションという名の
    言いたいこと先に言っとくやつ

    View full-size slide

  16. 「GoとJavaを並べるのは筋が悪い」

    架空の人:


    View full-size slide

  17. 「わかる」

    ぼく:


    View full-size slide

  18. ・JavaとGoを比べるのは筋が悪い(と思う)
    ・Javaならこう出来る…を捨てる
    ・しかし、言語に対してフェアに
    ・他の言語を知ってると、Goを一通り触らないと良い言語には感じ
    ないのではと思う(食わず嫌い的な)
    →なんかWebアプリでも作ってみて欲しい
    イントロダクション(僕の思うGoとJava)

    View full-size slide

  19. ・すべてを忘れてGoを書いてみるとジワジワ良さを感じてくる(効
    果には個人差があります)
    ・なんか物足りねえけどなんとかなるなぁみたいな
    ・ほーいいじゃないか、こういうのでいいんだよこういうので(出典:
    孤独のグルメ)
    イントロダクション
    イントロダクション(僕の思うGoとJava)

    View full-size slide

  20. ・Goはコンパイルが速くメモリを食いにくい
    →開発(者)に優しい
    ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
    →開発(者)に優しいかもしれないけど、
    メモリには厳しい
    イントロダクション
    イントロダクション(僕の思うGoとJava)

    View full-size slide

  21. ・Goはコンパイルが速くメモリを食いにくい
    →開発(者)に優しい
    ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
    →開発(者)に優しいかもしれないけど、
    メモリには厳しい
    イントロダクション
    イントロダクション(僕の思うGoとJava)
    goルーチンはすげえ軽い。Javaの
    スレッドは1スレッド固定長1MB(デ
    フォルト)、goルーチンは4KBの動的
    割り当て

    View full-size slide

  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/

    View full-size slide

  23. ・Goはコンパイルが速くメモリを食いにくい
    →開発(者)に優しい
    ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
    →開発(者)に優しいかもしれないけど、
    メモリには厳しい
    イントロダクション
    イントロダクション(僕の思うGoとJava)
    graalあたりで頑張るで!
    (今後数年が楽しみ)

    View full-size slide

  24. ・Goはコンパイルが速くメモリを食いにくい
    →開発(者)に優しい
    ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
    →開発(者)に優しいかもしれないけど、
    メモリには厳しい
    イントロダクション
    イントロダクション(僕の思うGoとJava)
    channelでmessage passingがとて
    も楽。そしていろんなパターンが出
    来る

    View full-size slide

  25. ・Goはコンパイルが速くメモリを食いにくい
    →開発(者)に優しい
    ・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
    →開発(者)に優しいかもしれないけど、
    メモリには厳しい
    イントロダクション
    イントロダクション(僕の思うGoとJava)
    Go Concurrency Patterns で検索
    https://talks.golang.org/2012/c
    oncurrency.slide#1

    View full-size slide

  26. ・Javaで作れるものは割とGoで作れる(別に低レイヤーのみでも
    ない)
    ・しかしJavaのようにGoを書こうとするとこじれる
    ・GoらしくGoを書くのが良い
    →だがそれが難しい(業務で感じたところ←今ココ)
    イントロダクション
    イントロダクション(僕の思うGoとJava)

    View full-size slide

  27. ・Javaで作れるものは割とGoで作れる(別に低レイヤーのみでも
    ない)
    ・しかしJavaのようにGoを書こうとするとこじれる
    ・GoらしくGoを書くのが良い
    →だがそれが難しい
    イントロダクション
    イントロダクション(僕の思うGoとJava)
    Goの方が得意そうなのはTUI、
    CLI(コマンド)系、並行処理(記述が
    簡単という意味では)

    View full-size slide

  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

    View full-size slide

  29. ・JavaもGoも開発のための手段
    ・手段だけどプログラマにとって大事なもの、選べる手段は多い方
    が良い
    ・GoはJavaの代替にもなるし、Javaでは扱いにくい部分も対応出
    来る(TUIやCUIなど)
    ・メモリ食いにくいので手軽
    イントロダクション
    イントロダクション(僕の思うGoとJava)

    View full-size slide

  30. ・JavaもGoも開発のための手段
    ・手段だけどプログラマにとって大事な道具、選べる道具は多い
    方が良い
    ・GoはJavaの代替にもなるし、Javaでは扱いにくい部分も対応出
    来る(TUIやCUIなど)
    ・メモリ食いにくいので手軽
    イントロダクション
    イントロダクション(僕の思うGoとJava)
    手札を増やしてみませんか?
    というのがJavaプログラマへ僕か
    ら出来るGoのススメ
    (Java好きの人はJavaがとても好きなの知ってるけど )

    View full-size slide

  31. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ

    View full-size slide

  32. ・言い尽くされているがGoに入ればGoに従え
    Goの目指しているところを知って、それに乗れば自然とうまくいく
    はず
    ・Goは素直なようでクセがある
    Goことはじめ
    Goことはじめ

    View full-size slide

  33. Go言語の初心者が見ると幸せになれる場所 #golang
    https://qiita.com/tenntenn/items/0e33a4959250d1a5504
    5
    Goことはじめ(Goに従う情報源)
    迷える人にオススメ
    Goことはじめ(Goに従う情報源)

    View full-size slide

  34. A Tour of Go
    http://go-tour-jp.appspot.com/#1
    Goことはじめ(Goに従う情報源)
    ササッと触ってみたい
    人向け
    Goことはじめ(Goに従う情報源)

    View full-size slide

  35. Frequently Asked Questions (FAQ)
    https://golang.org/doc/faq
    Goことはじめ(Goに従う情報源)
    色々気になることが
    多い人向け
    Goことはじめ(Goに従う情報源)

    View full-size slide

  36. みんなのGo言語
    Goことはじめ(Goに従う情報源)
    実用的な軽めの本読みたい人向け
    パラパラ漫画したい人向け
    Goことはじめ(Goに従う情報源)

    View full-size slide

  37. プログラミング言語Go(がっつり言語仕様知りたい人)
    Go言語による並行処理(goルーチンあたり知りたい人)
    Goならわかるシステムプログラミング(良い本)
    Goことはじめ(Goに従う情報源)
    しっかり
    本読みたい人向け
    Goことはじめ(Goに従う情報源)

    View full-size slide

  38. Effective Go
    https://golang.org/doc/effective_go.html
    Goことはじめ(Goに従う情報源)
    Go書いてて指針が
    欲しい人向け
    Goことはじめ(Goに従う情報源)

    View full-size slide

  39. Go Patterns
    http://tmrts.com/go-patterns/
    Goことはじめ(Goに従う情報源)
    builderパターンとか
    Functional Optionとか
    たまに便利
    Goことはじめ(Goに従う情報源)

    View full-size slide

  40. Standard Go Project Layout
    https://github.com/golang-standards/project-layout
    Goことはじめ(Goに従う情報源)
    名前に困ったら。
    あくまで参考程度に
    Goことはじめ(Goに従う情報源)

    View full-size slide

  41. Awesome Go
    https://awesome-go.com/
    Goことはじめ(Goに従う情報源)
    イケてるライブラリを
    使おう(ご利用は計画的に)
    Goことはじめ(Goに従う情報源)

    View full-size slide

  42. uber-go/guide
    https://github.com/uber-go/guide
    Goことはじめ(Goに従う情報源)
    最近話題になってました。参
    考程度に
    Goことはじめ(Goに従う情報源)

    View full-size slide

  43. 注意:
    golang.jpは情報が更新されなくなっています。
    古いものという前提で軽い参考程度になら良いかもしれない
    Goことはじめ(Goに従う情報源)
    Goことはじめ(Goに従う情報源)

    View full-size slide

  44. IDEなど開発環境は…?
    ・一番有力なのはVScode
    ・年貢収めている人ならGoland、IntelliJ IDEA有料版
    ・vimやemacsでもいける
    ・gopls使っていきましょう https://github.com/golang/go/wiki/gopls
    Goことはじめ(開発環境)
    Goことはじめ(Goに従う情報源)

    View full-size slide

  45. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ

    View full-size slide

  46. ※コード例がいくつか出ますが、
    一旦ざっくり把握してもらえれば良いです。
    時間の都合上
    色々説明が不足していますので、
    雰囲気だけでも感じてください。
    NOTE
    NOTE

    View full-size slide

  47. err := hoge();
    if err != nil {
    log.Error(err)
    }
    Goってこんなコード
    ・if err != nil
    Goってこんなコード

    View full-size slide

  48. err := hoge();
    if err != nil {
    log.Error(err)
    }
    Goってこんなコード
    ・if err != nil
    Goってこんなコード
    if err != nil でイディオムとして覚え
    て良いぐらい頻出

    View full-size slide

  49. if err := hoge(); err != nil {
    log.Error(err)
    }
    Goってこんなコード
    ・if err != nil
    Goってこんなコード
    または、ココでこう

    View full-size slide

  50. if err := hoge(); err != nil {
    log.Error(err)
    }
    Goってこんなコード
    ・if err != nil
    Goってこんなコード
    Exceptionない
    例外機構ない
    err != nil、ただそれだけ

    View full-size slide

  51. if err := hoge(); err != nil {
    log.Error(err)
    }
    Goってこんなコード
    ・if err != nil
    Goってこんなコード
    pkg/errorsか
    xerrorsを使っていきましょう
    (今後は多分xerrors)

    View full-size slide

  52. if err := hoge(); err != nil {
    log.Error(err)
    }
    Goってこんなコード
    ・if err != nil
    Goってこんなコード
    errは関数の戻り値の
    一番最後というキマリ↓
    たとえば
    func makeStr() (string, error)
    戻り値は多値に出来る

    View full-size slide

  53. m := map[string]string{}
    m["a"] = "aaaa"
    fmt.Println(m)
    //-=> map[a:aaaa]
    Goってこんなコード
    ・map
    Goってこんなコード

    View full-size slide

  54. m := map[string]string{}
    m["a"] = "aaaa"
    fmt.Println(m)
    //-=> map[a:aaaa]
    Goってこんなコード
    ・map
    Goってこんなコード
    普通にマップです

    View full-size slide

  55. if v, ok := m["a"]; ok {
    fmt.Printf("key=%v:value=%v", "a", v)
    }
    Goってこんなコード
    ・map
    Goってこんなコード
    contains的なのは
    こうやる

    View full-size slide

  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ってこんなコード

    View full-size slide

  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

    View full-size slide

  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…..

    View full-size slide

  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しまくると計算量に
    よっては…(ご利用は計画的に)

    View full-size slide

  60. for _, hoge := range hoges {
    fmt.Print(hoge)
    }
    // => a b c
    Goってこんなコード
    ・range
    Goってこんなコード

    View full-size slide

  61. for _, hoge := range hoges {
    fmt.Print(hoge)
    }
    // => a b c
    Goってこんなコード
    ・range
    Goってこんなコード
    さっきのslice
    [a, b, c] です

    View full-size slide

  62. for _, hoge := range hoges {
    fmt.Print(hoge)
    }
    // => a b c
    Goってこんなコード
    ・range
    Goってこんなコード
    rangeで添字と要素を取
    得できる
    _ で添字は無視、要素
    のみhogeに格納

    View full-size slide

  63. for k, v := range m {
    fmt.Printf("key=%v:value=%v", k, v)
    }
    // => key=a:value=aaaa
    Goってこんなコード
    ・range
    Goってこんなコード

    View full-size slide

  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] です

    View full-size slide

  65. for k, v := range m {
    fmt.Printf("key=%v:value=%v", k, v)
    }
    // => key=a:value=aaaa
    Goってこんなコード
    ・range
    Goってこんなコード
    mapのkeyとvalueを
    格納できます

    View full-size slide

  66. func deferSample() {
    defer fmt.Print("a")
    fmt.Print("b")
    fmt.Print("c")
    }
    // => b c a
    Goってこんなコード
    ・defer
    Goってこんなコード

    View full-size slide

  67. func deferSample() {
    defer fmt.Print("a")
    fmt.Print("b")
    fmt.Print("c")
    }
    // => b c a
    Goってこんなコード
    ・defer
    Goってこんなコード Javaで言うところのfinally
    deferでclose処理とかしたりする

    View full-size slide

  68. func highOrderFunc(
    beforeFunc func(),
    action func()) {
    beforeFunc()
    action()
    }
    Goってこんなコード
    ・高階関数
    Goってこんなコード

    View full-size slide

  69. highOrderFunc(
    func() { fmt.Print("前処理") },
    func() { fmt.Print("処理実行") },
    )
    // => 前処理 処理実行
    Goってこんなコード
    ・高階関数
    Goってこんなコード

    View full-size slide

  70. highOrderFunc(
    func() { fmt.Print("前処理") },
    func() { fmt.Print("処理実行") },
    )
    // => 前処理 処理実行
    Goってこんなコード
    ・高階関数
    Goってこんなコード
    AOP的なことをやったりとか。
    middlewareという
    呼ばれ方が多い印象

    View full-size slide

  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)
    }
    }
    ・テーブルドリブンテスト

    View full-size slide

  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ケースをガッとまとめて
    (語彙力)

    View full-size slide

  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)
    }
    }
    ビャッと検証
    (語彙力)

    View full-size slide

  74. Goってこんなコード
    ・goルーチン(めっちゃ雑)
    Goってこんなコード
    func job() { // よくあるjob処理
    fmt.Println("job Start...")
    defer func() {
    fmt.Println("job End...")
    }()
    }

    View full-size slide

  75. Goってこんなコード
    ・goルーチン(めっちゃ雑)
    Goってこんなコード
    func main() {
    go job() // goルーチン
    // server起動処理など...
    // ...
    }
    goルーチン使ってjobを実行させ
    たりとかする

    View full-size slide

  76. 雑すぎてgoルーチン伝わるわけねえ!

    Go Concurrency Patterns

    でぜひググってください(再掲)

    https://talks.golang.org/2012/concurrenc
    y.slide#1


    View full-size slide

  77. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ

    View full-size slide


  78. yy_yankさんへ

    時計を一旦見てね

    ここで25分経過ぐらいだと嬉しい

    (自分へのメッセージ)


    View full-size slide

  79. 巻いていこう


    View full-size slide

  80. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ

    View full-size slide

  81. ・Goはクロスプラットフォーム(win,mac,linux)
    ・色んなOS向けにバイナリを吐ける
    ・GOOSオプションでOSを指定、GOARCHオプションでアーキテ
    クチャを指定するだけでその環境向けの実行可能バイナリを生成
    Goの特徴(クロスコンパイル)
    Goの特徴(クロスコンパイル)

    View full-size slide

  82. package main
    import "fmt"
    func main() {
    fmt.Printf("Hello world\n")
    }
    Goの特徴(クロスコンパイル)
    ・hello worldやっときましょうか
    Goの特徴(クロスコンパイル)

    View full-size slide

  83. ・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の特徴(クロスコンパイル)

    View full-size slide

  84. ・GoにはGCがある
    ・トリコロールマーク&スイープGC
    ・なんですけど、まぁ本セッションでは割愛
    ・GoはC/C++的なレイヤーに近いように思いますが
    GCあるのでメモリ管理は不要
    Goの特徴(GC)
    Goの特徴(GC)

    View full-size slide

  85. ・GoにはGCがある
    ・トリコロールマーク&スイープGC
    ・なんですけど、まぁ本セッションでは割愛
    ・GoはC/C++的なレイヤーに近いように思いますが
    GCあるのでメモリ管理は不要
    Goの特徴(GC)
    Goの特徴(GC)
    GCある!
    Javaと一緒!
    実質Java!
    (出典:カロリーゼロ理論)

    View full-size slide

  86. ・Goは静的型付き
    ・Goには基本型と構造体がある
    ・ポインタもある
    ・interfaceもある
    ・速度速くて静的型がある、(僕は)嬉しい
    Goの特徴(言語仕様)
    Goの特徴(言語仕様)

    View full-size slide

  87. ・Goは静的型付き
    ・Goには基本型と構造体がある
    ・ポインタもある
    ・interfaceもある
    Goの特徴(言語仕様)
    Goの特徴(言語仕様)
    基本型:
    bool、string、int int8 int16 int32
    int64、uint uint8 uint16 uint32
    uint64、uintptr、byte、rune、
    float32 float64、complex64
    complex128

    View full-size slide

  88. ・Goは静的型付き
    ・Goには基本型と構造体がある
    ・ポインタもある
    ・interfaceもある
    Goの特徴(言語仕様)
    Goの特徴(言語仕様)
    構造体:
    type Hoge struct {
    a string
    b int
    }

    View full-size slide

  89. ・Goは静的型付き
    ・Goには基本型と構造体がある
    ・ポインタもある
    ・interfaceもある
    Goの特徴(言語仕様)
    Goの特徴(言語仕様)
    ポインタ:
    var a *string
    b := “b”
    a = &b

    View full-size slide

  90. ・Goは静的型付き
    ・Goには基本型と構造体がある
    ・ポインタもある
    Goの特徴(言語仕様)
    Goの特徴(言語仕様)
    type Hoge interface {
    Get() string
    Set(string)
    }

    View full-size slide

  91. ・フォーマットで争わなくて済む→gofmtです
    ・あと、未使用の変数やimportがあるとコンパイルエラーという優
    しさ
    ・Javaもgoogle/google-java-formatとかかけておけば良いと思
    うんです
    Goの特徴(言語仕様)
    Goの特徴(言語仕様)

    View full-size slide

  92. ・サーバー/クライアントがある(net/httpパッケージ)
    ・jsonも扱える(encoding/jsonパッケージ)
    ・ユニットテスト(testingパッケージ)
    ・winでもちゃんと動くpath/filepathパッケージ
    Goの特徴(言語仕様)
    Goの特徴(標準package)

    View full-size slide

  93. ・ライブラリの追加が簡単
    go get hoge/fuga
    Goの特徴(ライブラリ追加、依存管理)
    githubとかに公開しておけば
    go getとかすぐ出来る感じ
    Goの特徴(コマンドライブラリ追加理)

    View full-size slide

  94. ・ライブラリの追加が簡単
    go get hoge/fuga
    Goの特徴(ライブラリ追加、依存管理)
    CUIツールとか配布しやすい。peco
    とか
    Goの特徴(コマンドライブラリ追加理)

    View full-size slide

  95. ・誰が書いても同じようなコードになる(?)
    ・Goは本当に簡単か→それなりに難しい。平易に読みやすいが書
    くのはまぁまぁ難しい
    Goの特徴(Goは簡単か?という話)
    読むには読めるけど、
    サッと書くには慣れが必要
    Goの特徴(Goは簡単か?という話)
    Goの特徴(誰が書いても同じコード?)

    View full-size slide

  96. ・メソッド名、変数名は略す
    ・小文字がprivate、大文字がpublic
    ・スコープはpackage単位、レシーバー単位
    ・レシーバーとなり得るのはpackageか構造体など
    Goの特徴(Javaと違うとこ)
    Goの特徴(Javaと違うとこ)

    View full-size slide

  97. ・メソッド名、変数名は略す
    ・小文字がprivate、大文字がpublic
    ・スコープはpackage単位、レシーバー単位
    ・レシーバーとなり得るのはpackageか構造体など
    Goの特徴(Javaと違うとこ)
    大体go vetとかgolintが教えてくれ
    るはず
    Goの特徴(Javaと違うとこ)

    View full-size slide

  98. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ

    View full-size slide

  99. yy_yankさんへ

    落ち着いてもう一度時計を見てね

    ここで35分ぐらい経過だと嬉しい

    (自分へのメッセージ再び)


    View full-size slide

  100. 巻いていこう


    View full-size slide

  101. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ

    View full-size slide

  102. ・クラスが無いけどどうすりゃええの
    →structとかにメソッドはやす
    →ディレクトリ掘ってpackage作るファイル作る
    (むやみに作るのはダメ、ゼッタイ。)
    Goを使ってみる(ビルド、コーディング編)
    Go使いはじめ(ビルド、コーディング編)

    View full-size slide

  103. ・クラスが無いけどどうすりゃええの
    →type定義やstructにメソッドはやす
    →ディレクトリ掘ってpackage作るファイル作る
    (むやみに作るのはダメ、ゼッタイ。)
    Goを使ってみる(ビルド、コーディング編)
    Go使いはじめ(ビルド、コーディング編)
    package構成に唯一解はないけど、宗
    派はいくつかある
    割とみんな悩みながらやってたり割り
    切ってたりするらしい

    View full-size slide

  104. ・クラスが無いけどどうすりゃええの
    →type定義やstructにメソッドはやす
    →ディレクトリ掘ってpackage作るファイル作る
    (むやみに作るのはダメ、ゼッタイ。)
    Goを使ってみる(ビルド、コーディング編)
    Go使いはじめ(ビルド、コーディング編)
    個人的には
    自動生成系 + FW系 + 自前package
    で考えながら育てていくのが
    良いかなとか

    View full-size slide

  105. ・クラスが無いけどどうすりゃええの
    →type定義やstructにメソッドはやす
    →ディレクトリ掘ってpackage作るファイル作る
    (むやみに作るのはダメ、ゼッタイ。)
    Goを使ってみる(ビルド、コーディング編)
    Go使いはじめ(ビルド、コーディング編)
    ばっきばきにレイヤードアーキテクチャ
    とかそういうのやるなら多分Javaの方
    がやりやすい
    (Goで出来ないわけではないが…)

    View full-size slide

  106. ・ボイラープレートが増える?コード量が増える?
    →冗長さはあるけど、結局書く人次第。
    それ他の言語でも同じなのでは(自戒)
    Goを使ってみる(ビルド、コーディング編)
    Go使いはじめ(ビルド、コーディング編)

    View full-size slide

  107. ベンダリング
    ・go module一択になっていくと思われ
    ビルド
    ・普通にgo runとかgo buildが良いと思われ
    Goを使ってみる(ビルド、コーディング編)
    Go使いはじめ(ビルド、コーディング編)

    View full-size slide

  108. ・Javaで言うところのアレ、ある?
    ・そこに無かったらないですね
    ・ないものはない!Javaのことは忘れるんだ
    ※あるものはあります
    Javaで言うとこのアレ、ある?
    Go使いはじめ(Javaで言うところのアレ、ある?)

    View full-size slide

  109. ・文字列操作 stringsパッケージ、substring的なもの = rune
    ・文字列←→数値 strconv, fmt.Sprint
    ・文字列フォーマット fmt
    ・ソート sortパッケージ
    ・ファイルの読み書き ioutilパッケージ
    Javaで言うとこのアレ、ある?
    Go使いはじめ(Javaで言うところのアレ、ある?)

    View full-size slide

  110. ・Goやってて欲しくなる→強めのコレクションフレームワーク
    (anyMatch, filter,map,flatMap,reduce,contains的なもの)
    解決法:共通化したり、スニペットとかでガッと書く。
    filter欲しいなぁ、、、って考えてる暇に書く。
    これは慣れでなんとかなる。
    Goやってて欲しくなるもの
    Go使いはじめ(Goやってて欲しくなるもの)

    View full-size slide

  111. ・Goやってて欲しくなる→強めのコレクションフレームワーク
    (anyMatch, filter,map,flatMap,reduce,contains的なもの)
    解決法:またはgo generateを使う
    gen: slice typewriter とか
    https://clipperhouse.com/gen/slice/
    Goやってて欲しくなるもの
    Go使いはじめ(Goやってて欲しくなるもの)

    View full-size slide

  112. ・Goやってて若干欲しくなる→テスティングライブラリ
    ・Goとしては、あんまりテスティングライブラリとか使わず、標準の
    ものだけ使ってシンプルなものに保てみたいな方針だった記憶
    Goやってて欲しくなるもの
    Go使いはじめ(Goやってて欲しくなるもの)

    View full-size slide

  113. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ

    View full-size slide

  114. ・Goでハマったとこ超初期→forのイディオム覚えられない
    ・for hoge := range hoges {...} とかやってしまう
    Goを使ってハマった編
    Goを使ってハマった編
    覚えるしかない!rangeで何が取得でき
    るのか覚えるのに地味に苦労した

    View full-size slide

  115. ・循環依存
    import cycle not allowed
    Goを使ってハマった編
    Goを使ってハマった編
    package Aでpackage Bをimport
    package Bでpackage Aをimport
    しちゃダメよ。

    View full-size slide

  116. ・Goでハマったとこ→slice作りすぎて爆死
    むやみにループまわして無邪気にslice生成しまくると
    メモリが足りなくなるよ。しょぼいサーバーとか
    Goを使ってハマった編
    Goを使ってハマった編

    View full-size slide

  117. ・Goでハマったとこ→ログ吐いたらプロセス落ちるやん
    ・log.Fatalはos.Exitを呼んでいる
    ・カジュアルに使ってはいけない
    ・panicもカジュアルに使ってはいけない
    Goを使ってハマった編
    Goを使ってハマった編

    View full-size slide

  118. ・GoだったらJavaだったら…という大きな違いは処理面で出にく
    い。Goは並列処理は楽に安全にわりかし走らせやすい
    ・どこが問題になりやすいかといえば、結局外部サービス、DB、
    IOなど。これはどの言語でもだと思う
    Goを使ってハマった編
    Goを使ってハマった編

    View full-size slide

  119. ・イントロダクション(僕の思うGoとJava)
    ・Goことはじめ
    ・Goってこんなコード
    ・Goの特徴
    ・Go使いはじめ(yy_yank目線)
    ・Goを使ってハマった編(yy_yank目線)
    ・まとめ
    アジェンダ
    アジェンダ

    View full-size slide

  120. ・Goで手軽にマシンに優しいものが作れる
    ・Goに従えば手段が1つ増える
    ・アプリケーションを堅実に作れる
    ・並行処理も便利に使える
    まとめ
    まとめ

    View full-size slide

  121. ・Next Stepとなる更なる情報はgolang.tokyoやGo Conference
    など
    ・あなた自身がgopherになることで手に入ります!
    (丸投げ)
    まとめ
    まとめ

    View full-size slide

  122. 大事な手札を増やしていきましょう。

    ありがとうございました。


    View full-size slide

  123. これ以降のスライドは

    時間の都合などで

    発表ではカットしたものです


    View full-size slide

  124. ・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
    まとめ
    ボツネタ

    View full-size slide

  125. ・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
    まとめ
    ボツネタ

    View full-size slide

  126. ・Goで作られているサービス
    docker、k8s、istio、terraform、drone、prometheus などなどたくさん
    http://namaristats.com/langs/Go
    ・Goは誰が使っている?
    https://github.com/golang/go/wiki/GoUsers
    (あ、弊社も使ってますよ!)
    まとめ
    ボツネタ

    View full-size slide

  127. ・TUIライブラリまとめ
    https://appliedgo.net/tui/
    tviewとか結構いいらしいです
    https://github.com/rivo/tview
    まとめ
    ボツネタ

    View full-size slide

  128. ・GoのDIコンテナ
    wireやdigがあるが、それほどリッチではなさそう
    ・ORMのベンチマーク
    https://github.com/mattn/orm-benchmark
    まとめ
    ボツネタ

    View full-size slide

  129. ・ORM
    ORMのベンチマーク
    https://github.com/mattn/orm-benchmark
    awesome go ORM
    https://github.com/avelino/awesome-go#orm
    まとめ
    ボツネタ

    View full-size slide

  130. ・validator
    go-playground/validator が流行ってる?
    awesome-go validation
    https://github.com/avelino/awesome-go#validation
    まとめ
    ボツネタ

    View full-size slide

  131. ・ロガー
    zap流行ってる?
    zap https://github.com/uber-go/zap
    awesome go logging
    https://github.com/avelino/awesome-go#logging
    まとめ
    ボツネタ

    View full-size slide

  132. ・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
    まとめ
    ボツネタ

    View full-size slide

  133. ・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
    まとめ
    ボツネタ

    View full-size slide

  134. ・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
    まとめ
    ボツネタ

    View full-size slide

  135. ・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らしいので…という話
    まとめ
    ボツネタ

    View full-size slide

  136. ・エディタプラグイン(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
    まとめ
    ボツネタ

    View full-size slide

  137. ・エディタプラグイン(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
    まとめ
    ボツネタ

    View full-size slide

  138. ・Goのレイヤー分割のしんどいところ
    循環依存 import cycle not allowed
    リッチなDIコンテナが無い
    フレームワークとかがプロジェクトによってマチマチ(それは自然)。その中で統
    一した構成は結構難しいかもしれないという
    まとめ
    ボツネタ

    View full-size slide

  139. ・業務アプリケーションの package構成について(個人的感覚)
    docker、k8s、istio、terraform、drone、prometheus などなどありますが
    多分それをそのまま真似てもうまくいかない。
    どういう方針でも自分たち考えて徐々に育てていくことが大事。
    OSSのライブラリや SaaSとかIaaS的なものを作っている場合は真似しても良い気がするが、
    実際自分たちが作っているのは何なのか …というところ。
    レイヤー分割バリバリするようなホニャララアーキテクチャも結構 Goは向いていない。
    (かといってそれを実践している人たちを批判したいわけでもない )。
    自動生成は受け入れやすいので自動生成系とフレームワークのルールに従う。
    ライブラリを掛け合わせて最適化していくのが良いのかなと思いますが、
    誰かの言葉を借りてそれを答えだと思わないで欲しいのでこれも答えではありません。
    まとめ
    ボツネタ

    View full-size slide

  140. 自分の知識不足による誤りなどあれば教
    えていただけると幸いです。

    適宜、資料修正します。


    連絡先

    twitter @yy_yank


    View full-size slide