Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

【初心者向け】Go言語勉強会資料

28.001 visualizaciones

Publicado el

2015年6月4日に開催された初心者向けGo言語勉強会の資料です。
Go言語の歴史や特徴、プロジェクトでの導入事例などを広く発表しました。
入門用として、Go言語に興味を持っていただくきっかけになれば幸いです。

Publicado en: Software

【初心者向け】Go言語勉強会資料

  1. 1. 初心者向け Go言語勉強会 株式会社インテリジェンス 大谷 祐司 1 2015/06/04@ヒカラボ
  2. 2. 2 ① はじめに ② Go言語の歴史 ③ Go言語の特徴 ④ Go言語の導入事例 ⑤ まとめ アジェンダ
  3. 3. 3 はじめに
  4. 4. 4 ・山口県下関出身の34歳 ・インテリジェンスの新規事業チームの開発責任者。 ・企画からアプリ、インフラまで幅広くやっています。 ・車とプログラミングを愛しています。 ・土日は育児しながら勉強しています。 ・Facebookの友達申請は気軽にぜひ! https://www.facebook.com/yuji.otani.16 自己紹介
  5. 5. 5 5年 7年 6ヶ月 → → メイン開発言語の経歴
  6. 6. 6 会場の皆さんに質問です。
  7. 7. 7 質問① Go言語を実際に触ったことがあるかた
  8. 8. 8 質問② Go言語を業務で使っているかた
  9. 9. 9 質問③ 今のメイン言語はなんでしょうか?
  10. 10. 10 最近注目されているGo言語。 採用実績も増えています。 実際のプロジェクト導入事例をもとに、 Go言語について「広く浅く」理解を深 める場にできればと思います。
  11. 11. 11 まずはGo言語の歴史を 振り返ってみましょう。
  12. 12. 12 2009年 GoogleによりGo言語が発表される。 まだマイナーバージョン LinuxとMacOSXのみサポート。 オープンソース(BSDライセンス)
  13. 13. 13 「ここ10年以上、メジャーなシステム言語は 誕生していませんが、その間にコンピュータ の世界は大きく変化しています。」 開発の目的 http://golang.jp/go_faq
  14. 14. 14 ・コンピュータの処理の高速化 ・マルチコアコンピュータの出現 ・複雑な依存関係による遅いコンパイル。 ・扱いにくい型システムに対する反発 ・動的な型言語の人気が高まる。 http://golang.jp/go_faq コンピュータ世界の変化
  15. 15. 15 「コンパイルが早く、並列処理とガベージ コレクションを持つ新しい言語に取り組む ことに価値があると確信しました。」 http://golang.jp/go_faq 開発の目的
  16. 16. 16 C言語の開発者 : Ken Thompson UTF-8の開発者 : Rob Pike memcachedの開発者 : Brad Fitzpatrick 等の名だたるエンジニアによって 開発されました。 Go言語の開発者
  17. 17. 17 マスコットはゴーファー君
  18. 18. 18 AmazonでTシャツが買えます。
  19. 19. 19 2012年 初のメジャーリリース(Ver1.0) Windowsへの対応。 Google App Engine SDKの公開。
  20. 20. 20 しかし、当時の反応はいまいち・・・ http://www.infoq.com/jp/news/2012/04/Go-1 ・Goの採用はほとんど進んでいない。 ・ Tiobe’s Top 50 Language で選外になる。 ・言語としての将来性に大きな疑問が持たれている。 ・最終的には Google が唯一のユーザになるのではないか。
  21. 21. 21
  22. 22. 22 それから2年・・・
  23. 23. 23 2014年 バージョン1.4のリリース。 Androidの正式サポート →Go言語でAndroidアプリが開発 できるようになる。
  24. 24. 24 そして現在・・・
  25. 25. 25 2015年5月のRedMark人気言語ランキング http://redmonk.com/sogrady/categ ory/programming-languages/
  26. 26. 26 初のTOP20入り
  27. 27. 27 Googleトレンドでも人気急上昇中
  28. 28. 28 国内外で採用実績が多数
  29. 29. 29 http://www.infoq.com/jp/news/2012/04/Go-1 YouTube において Go を “コアインフラスト ラクチャに“使用していて,このサービスだけ で1日あたり 10 億以上のリクエストを処理 している。
  30. 30. 30 https://blogs.dropbox.com/tech/2014/07/open- sourcing-our-go-libraries/ 2013年に、パフォーマンスが重要なバックエン ドの処理をPythonからGo言語に移行。 2014年にライブラリをオープンソースで公開。 ・caching ・memcache ・sqlbuilder etc…
  31. 31. 31 http://engineer.typemag.jp/article/amebaownd 開発スピードが上がるため当初はスクリプト言語を検討 規模が拡大していくサービスモデルだったので、後々の メンテナンスが課題になると考えてGoを採用。 「新しいサービスなんだから、チャレンジしよう!」 AmebaOwndでGo言語を採用
  32. 32. 32 http://www.kayac.com/news/2014/07/golang カヤックは、Go言語を積極的に推進していきます。 ではなぜ「Goで行こう」と言い出したか。 平たくいうと、そろそろ最新の言語にチャレンジし たいじゃん! ってことです。 その言語としてGoを選びました。
  33. 33. 33 http://japan.zdnet.com/article/35059904/ 2月にGo言語用のSDKを提供開始しました。 (まだ実験的な状態) Java、C#、Ruby、Python、JavaScript、 PHP、Objective C に次ぐ8つ目のSDKです。
  34. 34. 34 http://itpro.nikkeibp.co.jp/atcl/column/14/346926/031900200/ メディアも注目
  35. 35. 35 ・MVCではなく、バッチやAPIでの採用が多い。 ・パフォーマンスが求められる部分に使われている。 ・フレームワークはRevelが多い。 ・「挑戦が許されている」会社が多い。 ・いわゆる「業務システム」での事例は少ない。 採用実績の傾向
  36. 36. 36 人気急上昇中のGo言語について、 特徴を簡単に説明します。
  37. 37. 37 特徴① コンパイル型言語
  38. 38. 38 Goはコンパイル言語です。 ソースコード 実行用 バイナリ コンパイル ・構文チェック ・依存関係チェック ・コード最適化
  39. 39. 39 実行しなくても、コンパイル時に構文や型、依存 関係などのエラーがわかる。 コンパイル言語のメリット① ソースの改修を行った時、依存関係を含めて影 響範囲の把握をしやすい。
  40. 40. 40 コンパイル済みのバイナリファイルを作成してお くことができる。 コンパイル言語のメリット② 予めコンパイルをしてけおけば、プログラムの 高速な実行が可能。
  41. 41. 41 ・実行時に構文や依存性のチェックを行うため、 実行するまでエラーがわからない。 ・初回のコンパイルが不要なので、 プログラムをすぐに実行することができる。 PHPやRubyなどのインタプリタ型言語
  42. 42. 42 ・構文エラー ・依存関係 ・変数の型 ・インポートして未使用のライブラリ ・引数、戻り値の型 ・使われてない変数 etc… Go言語のコンパイル時のエラーポイント
  43. 43. 43 依存するライブラリも含めてビルドファ イルを作成するので、別環境に持って いってもすぐに動かすことができます。 メインの処理 ビルドファイル依存ライブラリ1 依存ライブラリ2 コンパイル Go言語のコンパイルの特徴
  44. 44. 44 「インタプリタ型言語と感じられるほど早い」 言語を目指して開発されました。 Goの標準ライブラリ全体(12万行程度)でも9秒 でmakeが終了するという速さです。 Go言語のコンパイルは早い
  45. 45. 45 go runコマンドを実行すると、コンパイルと実行 を一度に行うことができます。 ソースの改修からの実行をスピーディーに行うこ とが可能です。 go run コンパイル 実行 Go言語をスクリプト言語的に実行する
  46. 46. 46 特徴② 高いパフォーマンス
  47. 47. 47 Go言語の採用理由として、高いパフォーマンス が挙げられることが多いです。 実際にAPIのバックエンドやバッチ処理など、パ フォーマンスがネックになる部分にGo言語が多 く採用されています。 高いパフォーマンス
  48. 48. 48 PHPのバッチと数種類のベンチマークをとって みましたが、パフォーマンスは高かったです。 しかし、処理によってはPHPの方が早いケース も見られました。 高いパフォーマンス
  49. 49. 49 1から1億までを加算する。
  50. 50. 50 1から1億までを加算する。 実際のベンチマーク例 $data = 0; for($i = 1; $i <= 100000000; $i++) { $data += $i; } PHP:3.47秒
  51. 51. 51 1から1億までを加算する。 実際のベンチマーク例 data := 0 for i := 1; i <= 100000000; i++ { data += i } Go:0.05秒
  52. 52. 52 1から1000万までを文字列として連結し ファイルに出力
  53. 53. 53 1から1000万までを文字列として連結しファイルに出力 実際のベンチマーク例 $data = ""; for($i = 1; $i <= 10000000; $i++) { $data .= $i; } flock($fp, LOCK_EX); fwrite($fp, $data); flock($fp, LOCK_UN); fclose($fp); PHP:1.47秒
  54. 54. 54 1から1000万までを文字列として連結しファイルに出力 実際のベンチマーク例 data := "" for i := 1; i <= 10000000; i++ { data += strconv.Itoa(i) } content := []byte(data) ioutil.WriteFile("exportgo.txt", content, os.ModePerm) Go(文字列連結):10分以上・・・
  55. 55. 55 1から1000万までを文字列として連結しファイルに出力 実際のベンチマーク例 var buffer bytes.Buffer for i := 1; i <= 10000000; i++ { buffer.WriteString(strconv.Itoa(i)) } content := []byte(buffer.String()) ioutil.WriteFile("exportgo.txt", content, os.ModePerm) Go(byte):0.95秒
  56. 56. 56 配列に100万件のデータを追加
  57. 57. 57 配列に100万件のデータを追加 実際のベンチマーク例 $arr = array(); for($i = 1; $i <= 1000000; $i++) { $arr[] = $i; } PHP:0.21秒
  58. 58. 58 配列に100万件のデータを追加 実際のベンチマーク例 var data [10000000]int for i := 1; i <= 10000000; i++ { data[i] = i } Go(配列を利用):0.03秒
  59. 59. 59 配列に100万件のデータを追加 実際のベンチマーク例 data := make([]int, 0, 10000000) for i := 1; i <= 10000000; i++ { data = append(data, i) } Go(キャパシティ指定スライスを利用) :0.05秒
  60. 60. 60 配列に100万件のデータを追加 実際のベンチマーク例 data := []int{} for i := 1; i <= 10000000; i++ { data = append(data, i) } Go(キャパシティ未指定スライスを利用) :0.18秒
  61. 61. 61 100万レコードのTSVを読み込む ↓ MySQLに1レコードずつ登録
  62. 62. 62 ・PHP :118秒 ・Go :134秒 実際のベンチマーク例 100万レコードのTSVを読み込む ↓ MySQLに1レコードずつ登録
  63. 63. 63 Goのパフォーマンスは高いと言われていますが、 使い方によってはパフォーマンスが発揮できない ことも・・・。 何がベストな方法か、試行錯誤しながらGo言語 に取り組んでいます。 Go言語のパフォーマンスについて
  64. 64. 64 特徴③ 型の扱い
  65. 65. 65 Go言語は厳密な型指定を必要とします。 「暗黙の型変換」はなく、明示的に型を指定 する必要があります。 想定しない型の値によって思わぬ不具合を 防ぐことができます。 Go言語における型
  66. 66. 66 構造体やインタフェース、並列処理用の型など、 Go言語には様々な型が存在します。 型を理解することで、GO言語の理解が一気に 進むように思います。 いくつかの型について見ていきましょう。 Go言語における型
  67. 67. 67 ・文字列型(string) ・数値型(int, float,unit…) ・論理値型(bool) etc 基本的な型
  68. 68. 68 ・配列型 (長さの指定が必要) ・スライス型 (長さの変更が可能な配列) ・マップ型 (キーと値のセット) ※配列に入れる型を宣言時に指定する。 集合を扱う型
  69. 69. 69 ・順番の決まった値を保持する。 ・初期化の際に配列の大きさを指定する。 ・大きさが異なると、別の型として扱われる。 ・あとから大きさの変更はできない。 1 2 3 4 5 配列型
  70. 70. 70 ・初期化時に長さと容量を指定する。 ・要素の追加で長さの変更が可能。 ・容量を超えた場合には自動的に拡張される。 ・・・ 1 2 3 4 5 スライス型
  71. 71. 71 ・キーと値をセットで持つ。 ・キーと値の型を指定して初期化する。 ・キーを指定して値を追加する。 B A D EC マップ型
  72. 72. 72 ・名前と型を持つフィールドの集まり。 ・typeと組み合わせてクラスのように使用できる。 ・先頭が大文字のフィールドは外部から参照可能。 type User struct { id string name string Address string } 構造体(struct)
  73. 73. 73 ・メソッドを追加することができる。 ・先頭が大文字のメソッドは外部から参照可能 func (p *User) GetId() string { return p.id } func (p *User) getName() string { return p.name } 構造体(struct)
  74. 74. 74 ・コンストラクタはない。 ・継承などはなく、単体で存在する。 →依存関係の複雑さを回避する。 ・構造体に構造体を埋め込むことで、継承に 似た動作を実現できる。 構造体(struct)
  75. 75. 75 ・メソッドの型だけを列挙した型。 ・インターフェースで宣言されているメソッドが すべて実装されている構造体であれば何でも 同じものとして扱うことができる。 ・「空のインタフェース」は、どんな型としても 扱うことができる。 インタフェース型
  76. 76. 76 ・並列実行時の管理を実現するための型。 ・スレッド間の同期/値の受渡しを行う。 チャネル型
  77. 77. 77 今回はあまり深い説明はできませんでしたが、 型の理解はGo習得にとってとても重要です。 A tour of Goで学習可能ですので、ぜひチャレン ジしてみてください。 Go言語における型 https://go-tour-jp.appspot.com/#1
  78. 78. 78 特徴④ 「楽しく」「スマートに」コーディング!
  79. 79. 79 「Go言語は、プログラマが何を行い、どのよう にプログラミングするか、あらゆる点において考 え抜き設計しいます。 これはプログラミングがより楽しいものになるこ とも意味しています。」 「楽しく」「スマートに」コーディングできる。 http://golang.jp/go_faq
  80. 80. 80 ・行末のセミコロンが不要。 ・ifの後のカッコが不要。 ・ループはforのみで行い、foreachやwhileがない。 ・try-catch文はコードが入り組むので存在しない。 「楽しく」「スマートに」コーディングできる。
  81. 81. 81 ・関数が複数の戻り値を返せる。 「楽しく」「スマートに」コーディングできる。 name, age, address := getUserInfo() func getUserInfo() string, int, string { name := “大谷 祐司” age := 20 address := “yuji.otani@inte.co.jp” return name, age, address }
  82. 82. 82 ・型推論を利用した初期化が可能。 下記の記述で数字型のage, 文字列型のnameを 宣言できる。 「楽しく」「スマートに」コーディングできる。 age := 20 address := “yuji.otani@inte.co.jp”
  83. 83. 83 エラー処理について ・try-catchはなく、戻り値で例外を返す。 ・関数で複数の戻り値が返せるので、そこに 含めるのが一般的 //DBのコネクションオープン mainDb, err = sql.Open("mysql", appConf.Mariadb) 「楽しく」「スマートに」コーディングできる。
  84. 84. 84 特徴⑤ 並列処理のサポート
  85. 85. 85 言語そのものが並列処理を念頭に設計されており、 ゴールーチンやチャンネルを使って、簡単に並列 処理を実装できます。 並列処理のサポート
  86. 86. 86 PHP開発をしていたとき、複数バッチを並列で 処理するのは職人技でした。 Go言語でバッチを書くようになって、並列処理 が楽しくなりました。 並列処理のサポート
  87. 87. 87 特徴⑥ マルチコアプログラミングのサポート
  88. 88. 88 Go言語実行時に使用するコア数を指定できます。 (関数または環境変数でGOMAXPROCSを指定) 並列処理時に適切にコアに処理を割り当てられ、 効率よい並列処理が実現可能です。 マルチコアプログラミング
  89. 89. 89 特徴⑦ ソースコードのフォーマット
  90. 90. 90 go fmtコマンドを実行することで、コード を整形してくれます。 before after
  91. 91. 91 インデントの整形までしてくれます。
  92. 92. 92 Go fmtによるコードフォーマット ・インデントをタブに変換 ・必要な部分にスペースや改行の挿入 ・不要なスペースや改行の除去 ・行末のセミコロンの削除 ・インポートの順番をABC順に変更 etc
  93. 93. 93 Go言語の特徴的な部分についていくつか 紹介しました。 次に、実際にプロジェクトでどのように 活用しているかをご紹介します。
  94. 94. 94 プロジェクトでの活用事例
  95. 95. 95 7月に正式リリース予定の転職サイトで、 社内で初めてGo言語を採用しました。 現在は法人向けに公開しています。
  96. 96. OS :CentOS7 Webサーバ :nginx DB :MariaDB10.0 インフラ管理 :Ansible Web開発言語 :Hack(hhvm3.5) フレームワーク :FuelPHP1.7 バッチ開発言語 :Go言語 採用している技術 96
  97. 97. サーバ構成(GMOクラウド) 97 Internet LB LB Web/Cache DB BatchRedis-Slave
  98. 98. ・ローカルマシンで開発 ・Gitにコミット ・Jenkinsで各サーバに配置してシェルでビルド。 ・ビルドでエラーが無ければ実行ファイルを入れ替える。 開発/デプロイのフロー 98
  99. 99. 99 ・データ連携/集計、アラートなどのバッチ ・サービス管理用のツール(Revel) ・コンパイルしてHackから実行 Go言語を利用している部分
  100. 100. 100 バッチが多く、かつ処理が複雑になりそうだった。 並列処理を活用する場面が多そうだった。 高いパフォーマンスと並列処理の仕組みを持っている。 Go言語を選択した理由
  101. 101. 101 最低限の機能で開発してから機能追加していく 初期リリース時には最低限のテストコードのみを書く メンテナンスやリファクタリングしやすい。 コンパイル言語が合っている。 Go言語を選択した理由
  102. 102. 102 これからメジャーになっていく言語だという確信。 PHPエンジニアが習得しやすい言語だという話を聞く。 周りのGopherがみんな楽しそう。 Go言語を採用して、チームのチャレンジ意識を高めたい。 Go言語を選択した理由
  103. 103. 103 ・タイトなスケジュールの中で、全員のGoの習得が難しい。 ・Webでの採用実績が少なく、リスクだと考えた。 ・Go言語の技術者を採用するのが困難だった。 ・テンプレートに関する情報が少なかった。 ・デザイナーとの協業でSmartyの採用がスムーズだった。 WebがGo言語ではない理由
  104. 104. 104 ・始めは「意外と学習コストかかる」ということで苦戦。 ・慣れてくると「Goを書くのが楽しい」ファンが続出。 ・ソース修正後の影響範囲が把握しやすい。 ・型縛りに戸惑ったが、慣れるととても分かりやすい。 使ってみた感想
  105. 105. 105 「ゴールーチン」「チャネル」「セレクト」を理解し ておけば、すんなりと実装できました。 クラウドサービスを利用しているので、コア数によっ て並列実行数を自動的に変える仕組みは便利です。 並列処理がとても楽
  106. 106. 106 Go言語の習得に取り組んだこと
  107. 107. 107 A Tour of Goをみんなでやる。 https://tour.golang.org
  108. 108. 108 ハンズオン勉強会を開催して、その後に 飲みに行ってみんなでGoについて語る。
  109. 109. 109 コードレビューを部門横断でみんなでやる。
  110. 110. 110 Effective Goをチームのみんなで読む。 http://golang.org/doc/effective_go.html
  111. 111. 111 ハマったポイント
  112. 112. 112 View周りの情報がとても少ないです。 癖のあるテンプレートエンジン・・・ selectboxに初期選択値を設定できずに ハマりました。 テンプレートエンジン
  113. 113. 113 teratailで初めて質問するが、回答がつかずに 凹みます・・・
  114. 114. 114 なんとかチーム内で解決しましたが、ハマる と本当に厄介です。。
  115. 115. 115 構造体において、変数や関数は先 頭が大文字ならアクセス可能。 慣れるまで何度もコンパイラに怒 られました。。。 getData() GetData() 大文字、小文字でのアクセス制御
  116. 116. 116 Mapは順番を持っておらず、PHP の連想配列の感覚で利用すると、 取り出す順序の入れ替わりでうま く動作しない部分がありました。 B A D EC Mapから取り出す順番
  117. 117. 117 最近は日本語の情報も増えてきており、 ハマってもネットの情報で解決できるこ とが多かったです。 今ではメンバーもGo言語に慣れてきて、 楽しく開発を行っています。
  118. 118. 118 さいごに
  119. 119. 119 私はGo言語に出会ってから、プログラミン グがとても楽しくなりました。 これからもGo言語を盛り上げていければと 思います。
  120. 120. 120 Go言語を学習していくなかで、golang.jpをとても 参考にさせてもらいました。 株式会社エイベルさんに感謝です。
  121. 121. 121 インテリジェンスでは、Go言語を採用したプロ ジェクトがいくつか立ち上がっています。 エンジニアを募集していますので、興味ある方は お声がけください!
  122. 122. 122 ご静聴ありがとうございました。
  123. 123. 123 この資料は、正確な記述を心がけて作成しており有用だ と思われますが、内容の正確性や有用性を作者は保証し ません。また、本資料は作者個人が作成したものであり、 所属する組織・団体の見解等を表すものではありません。 免責事項

×