About Go Lang

About Go Lang

2014/5/9 Livesense SICP倶楽部LT大会にて
Goについての解説

E60aa4f80303f3f386898546ddb3686a?s=128

Livesense Inc.

May 15, 2014
Tweet

Transcript

  1. GO言語 岡前直由

  2. Agenda •  Go言語とは •  特徴 •  言語仕様 •  Interface • 

    並列処理の仕組み
  3. Go言語とは •  Googleが開発したコンパイラ言語 •  2009年、Robert Griesemer, Rob Pike, Ken Thompson

    •  対象:大規模なシステムソフトウェア、サーバソフトウェア •  低レイヤとの親和性(プロセス管理、システムコール…) •  C/C++に並ぶ実行速度 •  開発者の増大に耐える、シンプルな洗練された言語セット C/C++に代わる新しい選択肢
  4. Go言語の特徴 •  静的型付け + 型推論 •  ネイティブコードへのコンパイル •  Linux, OS

    X, Free BSD, Windows •  DuckTyping •  ガベージコレクション •  豊富なライブラリ C言語に動的型付け言語の技術を取り込んだ
  5. 言語仕様 •  基本はCの拡張 •  関数と構造体(+メソッド) •  基本文法は大きく変化 •  変数・関数宣言の型は後置 • 

    var message string = "hello" •  変数宣言時に型の明示が不要(型推論) •  message := "hello" •  ループはfor文のみ •  基本方針:シンプルかつ必要十分な言語セット
  6. 言語仕様(続き) •  クラス階層が存在しない •  継承が存在しない •  簡易な委譲の仕組みが提供されている •  複数戻り値、複数同時代入 • 

    a, b = b, a •  ポインタ演算は存在しない •  配列に対するアドレス加算などはできない •  Slice •  固定長配列をラップした組み込み型 •  メモリ領域の再確保などを容易に行える •  第一級関数 •  クロージャが作れる •  コールバック関数など •  Interfaceを用いたDuckTypingの実現 •  並列処理を容易にする機能 •  Goroutine, Channel
  7. いわゆる「クラス」の表現 type!Vertex!struct!{! !!X,!Y!float64! }! !! func!(v!*Vertex)!Abs()!float64!{! !!return!math.Sqrt(v.X*v.X!+!v.Y*v.Y)! }! !! func!main()!{!

    !!v!:=!&Vertex{3,!4}! !!fmt.Println(v.Abs())! }! struct メソッド +
  8. Interface •  大体Javaと同じ •  抽象と具象を分離 •  ポリモーフィズムを実現 •  実装型でimplements宣言は不要 • 

    DuckTypingを実現 type!Abser!interface!{! !!Abs()!float64! }! インターフェース宣言:メソッド型定義の羅列
  9. 実装型 •  必要なメソッドを実装するだけ type!Vertex!struct!{! !!X,!Y!float64! }! !! func!(v!*Vertex)!Abs()!float64!{! !!return!math.Sqrt(v.X*v.X!+!v.Y*v.Y)! }!

    Vertex構造体(再掲) インターフェースAbserを実装しているとみなされる
  10. Interface型の利用 •  Interface型を引数に取る関数を定義すると... •  Vertex型だけじゃなく、Abs()を実装した型はなんでも入れられ る func!showAbs(a!Abser)!{! !!fmt.Println(a.Abs())! }! 静的なDuckTypingを実現

  11. 並列処理 Foo() Bar() Baz() go Foo() go Bar() Baz() 逐次処理

    並列処理 Foo(), Bar()はそれぞれ新しい Goroutineで並列実行される •  Goroutine(ゴルーチン)という仕組みを使う •  スレッドのようなもの
  12. Goroutineとは •  概ねスレッドのようなもの •  Goroutine != スレッド •  スレッドをさらに分割したもの • 

    一つのスレッドに複数のGoroutine •  軽量 •  たくさん立ち上げられる Goroutine プロセス スレッド スレッド Goroutine
  13. Goroutine間の通信 •  1. 共有メモリを使う •  Mutexが用意されている •  2. Channelという仕組みを使う • 

    Goが推奨する並行処理モデル •  メッセージパッシング •  Go曰く:"Do not communicate by sharing memory; instead, share memory by communicating" メモリ共有によって通信するのではなく、通信によってメモリを共有しろ
  14. Channel func  RoutineA(c  chan  int)  {        

     ...          c  <-­‐  v          ...   }     func  RoutineB(c  chan  int)  {          ...          var  v  :=  <-­‐c          ...   } •  値の交換と同期を担ってくれる RoutineAが c <- v を実行するまで ブロックされる channel c
  15. まとめ •  Go言語はC/C++に動的言語の流行技術を取り込んだ •  速度が要求される低レイヤのシステムで生産性が上がりそう •  DockerはGoで書かれている •  Webアプリケーションとの親和性は不明 • 

    Rubyと比べて優位性は無いように見える
  16. 終わり 質疑応答