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

JavaScript経験者のためのGo言語入門

Avatar for shoarai shoarai
October 21, 2016

 JavaScript経験者のためのGo言語入門

JavaScriptを書いたことがある人向けに、Go言語の言語仕様を紹介します。

Avatar for shoarai

shoarai

October 21, 2016

Other Decks in Programming

Transcript

  1. Go は言語仕様がシンプル Go ルー プはfor のみ、while がない if の{} が省略できない

    for やif の() がいらない 三項演算子がない など JavaScript ECMAScript6、 それ以前、AltJS など言語仕様が多種多様 ... ルー プ1 つとっても、for、forEach、for in、$.each、$.map ... orz 6
  2. Go が提供して いない もの 他の多くの言語で提供しているものが、Go にはない 暗黙の数値変換 コンストラクタ デストラクタ 演算子オー

    バー ロー ド デフォルトのパラメー タ値 継承 ジェネリクス 例外 マクロ 関数アノテー ション スレッドロー カルな領域 7
  3. Setup インストー ル 公式サイトからインストー ルできる。 あるいは、Homebrew からもインストー ルできる $ b

    r e w i n s t a l l g o 環境設定 $ e x p o r t G O R O O T = $ H O M E / g o $ e x p o r t P A T H = $ P A T H : $ G O R O O T / b i n 15
  4. Hello World helloworld.go / / このファイルが属するパッケー ジ名 p a c

    k a g e m a i n / / 利用するパッケー ジ名 i m p o r t " f m t " / / m a i n パッケー ジのm a i n 関数からプログラムが実行される f u n c m a i n ( ) { f m t . P r i n t l n ( " H e l l o , 世界" ) } 実行 $ g o r u n h e l l o w o r l d . g o > H e l l o , 世界 16
  5. パッケー ジと関数 Go p a c k a g e

    m a i n i m p o r t " f m t " f u n c m a i n ( ) { f m t . P r i n t l n ( " H e l l o , 世界" ) } JavaScript ( f u n c t i o n ( m a i n , w i n ) { m a i n . m a i n = f u n c t i o n ( ) { w i n . a l e r t ( " H e l l o , 世界" ) ; } ; } ( m a i n | m a i n = { } , w i n d o w ) ) ; 17
  6. 変数宣言 Go / / どちらもs は、 空文字 s : =

    " " / / 初期値から型が推測される v a r s s t r i n g / / 型のゼロ値が設定される / / 以下のようにも書ける v a r s = " " v a r s s t r i n g = " " JavaScript l e t s = " " ; / / E S 6 v a r s = " " ; / / 関数ブロックスコー プ 18
  7. if Go x : = 1 i f x >

    0 { / / . . . } e l s e x < 0 { / / . . . } JavaScript v a r x = 1 ; i f ( x > 0 ) { / / . . . } e l s e ( x < 0 ) { / / . . . } 19
  8. ルー プ Go s t r s : = {

    " あ" , " い" } f o r i : = 0 ; i < l e n ( s t r s ) ; i + + { / / . . . } JavaScript v a r s t r s = [ " あ" , " い" ] ; f o r ( v a r i = 0 ; i < s t r s . l e n g t h ; i + + ) { / / . . . } 20
  9. ルー プ(range) Go s t r s : = {

    " あ" , " い" } f o r i , s : = r a n g e s t r s { / / . . . } JavaScript v a r s t r s = [ " あ" , " い" ] ; s t r s . f o r E a c h ( f u n c t i o n ( s , i ) { / / . . . } ) ; 21
  10. ルー プ( 条件のみ) Go f o r c o u

    n t < 1 0 { / / . . . } / / 無限ルー プ f o r { / / . . . } JavaScript w h i l e ( c o u n t < 1 0 ) { / / . . . } / / 無限ルー プ w h i l e ( t r u e ) { / / . . . } 22
  11. switch Go x : = 0 s w i t

    c h x { c a s e 0 : n u m = 1 / / b r e a k は不要 c a s e 1 : n u m = 3 d e f a u l t : n u m = - 1 } r e t u r n n u m / / 1 23
  12. デー タ型 Go JavaScript 整数 int, int8, int6 number 正の整数

    uint, uint8, uint16, uint32, uint64 number ポインタ uintptr - 浮動小数 float32, float64 number 複素数 complex64, complex128 - ブー リアン bool bool バイト byte - 文字 rune string 文字列 string string エラー error - 26
  13. コンポジット型( 配列・ マップ) Go a : = [ 3 ]

    i n t { 1 , 2 , 3 } / / 配列( 長さが固定) b : = [ ] i n t { 0 , 1 , 2 , 3 , 4 , 5 } / / スライス( 長さが可変) c : = m a p [ s t r i n g ] i n t { / / 文字列からi n t へのマップ " a " : 1 , " b " : 2 , } JavaScript v a r a = [ 1 , 2 , 3 ] ; / / ※ 長さが固定はない v a r b = [ 1 , 2 , 3 , 4 , 5 ] ; v a r c = { / / マップをオブジェクトで表現 " a " : 1 , " b " : 2 } ; 27
  14. コンポジット型( 構造体) Go / / 構造体型の宣言 t y p e

    E m p l o y e e s t r u c t { I D i n t N a m e s t r i n g } / / 構造体変数の宣言 a l i c e : = E m p l o y e e { 0 , " a l i c e " } JavaScript / / 構造体をオブジェクトで表現 v a r a l i c e = { I D : 0 , N a m e : " a l i c e " } ; 28
  15. 関数宣言 Go / / 引数と戻り値それぞれの型を宣言する f u n c h

    y p o t ( x , y f l o a t 6 4 ) f l o a t 6 4 { r e t u r n m a t h . S q r t ( x * x , y * y ) } f m t . P r i n t l n ( h y p o t ( 3 , 4 ) ) / / " 5 " JavaScript f u n c t i o n h y p o t ( x , y ) { r e t u r n m a t h . S q r t ( x * x , y * y ) ; } c o n s o l e . l o g ( h y p o t ( 3 , 4 ) ) ; / / " 5 " 29
  16. 関数宣言( 可変個引数) Go f u n c s u m

    ( v a l s . . . i n t ) i n t { t o t a l : = 0 f o r _ , v a l : = r a n g e v a l s { t o t a l + = v a l } r e t u r n t o t a l } JavaScript / / 可変個引数はE S 6 のみ f u n c t i o n s u m ( . . . v a l s ) { v a r t o t a l = 0 v a l s . f o r E a c h ( f u n c t i o n ( v a l , i ) { t o t a l + = v a l ; } ) ; r e t u r n t o t a l ; } 30
  17. 遅延関数呼び出し 正常な完了でも異常な完了でも、 関数の最後に到達するまで関数 の呼び出しが遅延される。 Go f u n c l

    o o k u p ( k e y s t r i n g ) i n t { m u . L o c k ( ) / / l o o k u p 関数が完了する直前に呼ばれる d e f e r m u . U n l o c k ( ) / / . . . r e t u r n m [ k e y ] } Javascript なし 31
  18. エラー 処理 Go Go では、 関数ごとにエラー 処理を行う。 r e s

    p , e r r : = h t m l . p a r s e ( t e x t ) i f e r r ! = n i l { r e t u r n e r r } JavaScript try で複数の関数のエラー をまとめて扱えるため、 エラー と関数の 関連がわかりにくい。 t r y { p a r s e H t m l ( t e x t ) ; p a r s e J s o n ( j s o n ) ; } c a t c h ( e r r ) { t h r o w e r r ; } 32
  19. パニック パニックとは、 例えば境界外への配列アクセス、nil ポインタによ る参照など、 実行時の誤りが検出された時に発生する。 Go f u n

    c R e s e t ( x * B u f f e r ) { i f x = = n u l l { p a n i c ( " x i s n i l l " ) } x . e l e m e n t = x } JavaScript なし 33
  20. メソッド宣言 Go t y p e P o i n

    t s t r u c t { X , Y f l o a t 6 4 } f u n c ( p * P o i n t ) S c a l e B y ( f a c t o r f l o a t 6 4 ) { p . X * = f a c t o r p . Y * = f a c t o r } JavaScript f u n c t i o n P o i n t ( x , y ) { t h i s . X = x ; t h i s . Y = y ; } P o i n t . p r o t o t y p e . S c a l e B y = f u n c t i o n ( f a c t o r ) { t h i s . X * = f a c t o r ; t h i s . Y * = f a c t o r ; } ; 35
  21. メソッド呼び出し Go p : = P o i n t

    { 1 , 2 } / / 初期化 p . S c a l e B y ( 1 0 ) / / X = 1 0 , Y = 2 0 JavaScript v a r p = n e w P o i n t ( 1 , 2 ) ; / / 初期化 p . S c a l e B y ( 1 0 ) ; / / X = 1 0 , Y = 2 0 36
  22. インタフェー ス Go では、 インタフェー スが持つ関数と同じ名前・ 同じ型の関数が あれば、 暗黙的にそのインタフェー スの振る舞い要件を満たす。

    t y p e G e t t e r i n t e r f a c e { G e t T e x t ( ) s t r i n g } t y p e T e x t s t r u c t { t e x t s t r i n g } f u n c ( t T e x t ) G e t T e x t ( ) s t r i n g { r e t u r n t . t e x t } / / T e x t 型はG e t t e r 型の変数に代入できる v a r g e t t e r G e t t e r g e t t e r = T e x t { " t e s t " } f m t . P r i n t l n ( g e t t e r . G e t T e x t ( ) ) / / " t e s t " 37
  23. 並行処理( ゴルー チン) Go では、 並行に実行される個々 の動作を ゴルー チン 、

    main 関数を呼び出すゴルー チンを メインゴルー チン といいます。 HTTP Server / / メインゴルー チンがm a i n 関数を呼び出す f u n c m a i n ( ) { l , _ : = n e t . L i s t e n ( " t c p " , " l o c a l h o s t : 8 0 0 0 " ) f o r { / / クライアントの接続要求を待つ c o n n , _ : = l . A c c e p t ( ) / / メインゴルー チンが新たなゴルー チンを生成する g o h a n d l e C o n n ( c o n n ) } } f u n c h a n d l e C o n n ( c n e t . C o n n ) { / / 接続ごとの処理を行う. . . } 39
  24. 並行処理( チャネル) 1 つのゴルー チンが他のゴルー チンへ値を送ることができる通信の 仕組みを チャネル といいます。 f

    u n c m a i n ( ) { / / i n t 型のチャネルを作成する c h : = m a k e ( c h a n i n t ) / / 生成されたゴルー チンはチャネルに値を送信し続ける g o f u n c ( ) { f o r x : = 0 ; ; x + + { c h < - x } } ( ) / / メインゴルー チンはチャネルの値を受信し、 出力し続ける f o r { f m t . P r i n t f ( < - c h ) / / 0 1 2 3 4 5 6 . . . } } 40
  25. ドキュメンテー ション # 例:t i m e パッケー ジのドキュメントを表示する $

    g o d o c t i m e > p a c k a g e t i m e / / i m p o r t " t i m e " > > P a c k a g e t i m e p r o v i d e s f u n c t i o n a l i t y f o r m e a s u r i n g a n d d i s p l a y > > T h e c a l e n d r i c a l c a l c u l a t i o n s a l w a y s a s s u m e a G r e g o r i a n c a l e n d > > c o n s t A N S I C = " M o n J a n _ 2 1 5 : 0 4 : 0 5 2 0 0 6 " . . . > c o n s t N a n o s e c o n d D u r a t i o n = 1 . . . > . . . 43
  26. コンパイル # 実行ファイルを生成する $ g o b u i l

    d h e l l o w o r l d . g o # 実行する $ . / h e l l o w o r l d > H e l l o , 世界 44
  27. クロスコンパイル # L i n u x 、3 2 ビット用の実行ファイルを生成する

    $ G O O S = l i n u x G O A R C H = 3 8 6 g o b u i l d h e l l o w o r l d . g o # 実行する $ . / h e l l o w o r l d > H e l l o , 世界 45
  28. コー ドの整形 p a c k a g e m

    a i n i m p o r t " f m t " f u n c m a i n ( ) { f m t . P r i n t l n ( " H e l l o , 世界" ) ; } ↓ ↓ $ g o f m t m a i n . g o ↓ 整形 ↓ p a c k a g e m a i n i m p o r t " f m t " f u n c m a i n ( ) { f m t . P r i n t l n ( " H e l l o , 世界" ) } 46
  29. テスト p a c k a g e w o

    r d / / テストに使用するパッケー ジ i m p o r t " t e s t i n g " / / T e s t . . . から始める f u n c T e s t I s P a l i n d r o m e ( t * t e s t i n g . T ) { / / 回文チェックの関数 i f ! I s P a l i n d r o m e ( " k a y a k " ) { / / エラー 報告 t . E r r o r ( ` I s P a l i n d r o m e ( " k a y a k " ) = f a l s e ` ) } } 実行結果 $ g o t e s t > P A S S > o k g o p l . i o / c h 1 1 / w o r d 2 2 . 4 3 0 s 合計の処理時間:2.430 秒 47
  30. ベンチマー ク f u n c B e n c

    h m a r k I s P a l i n d r o m e ( b * t e s t i n g . B ) { f o r i : = 0 ; i < b . N ; i + + { I s P a l i n d r o m e ( " k a y a k " ) } } 実行結果 $ g o t e s t - b e n c h = . > B e n c h m a r k I s P a l i n d r o m e - 4 3 0 0 0 0 0 0 6 0 5 n s / o p > P A S S > o k g o p l . i o / c h 1 1 / w o r d 2 2 . 4 3 0 s 使用するコア数:4( 設定可能) 実行回数:300,000( 処理時間が安定する回数が推定される) 個々 の処理時間:605 ナノ秒 合計の処理時間:2.430 秒 48