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