[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
SlideShare a Scribd company logo
Goノススメ
21世紀のプログラミング言語
             山口 能迪
      id : ymotongpoo
                        1
自己紹介

• 山口能迪(やまぐちよしふみ)
• YouTube Technical Account Manager, Google
  Inc.
• id: ymotongpoo
  – とんぷーと呼ばれています




                                              2
自己紹介

• Pythonが好きです
• 翻訳

   「Java開発者のための関数プログラミング」
        オライリー・ジャパン
        2012年06月発行 1,365円 (Ebook)


   「Learn You Some Erlang for Great Good!」
        オーム社
        絶賛翻訳中 価格未定


                                             3
これまで使ってきた言語

•   C++       動力学計算をゴリゴリと
•   Java      前職で製品の拡張など
•   PHP       学生時代にWebサービス開発
•   Python   汎用的になんでも
•   OCaml    アルゴリズム
•   Go        汎用的になんでも




                               4
どんな言語を使ってますか?

•   C             •   Python
•   Java          •   Ruby
•   Objective-C   •   Perl
•   C++           •   PHP
•   C#            •   JavaScript
•   Erlang        •   Lua
•   Haskell       •   R
•   OCaml         •   Prolog
•   Common Lisp   •   Tcl

                                   5
なぜその言語を
使っていますか?



           6
◯◯言語を使う理由

• 実行速度が速い
• ビルドをしなくて済む
• 煩わしい型を明記しなくてよい
• テストがしやすい
• Webアプリが簡単に作れる
• 並列処理が簡単に書ける
etc...



                   7
不満に思うことは
 ありませんか?



           8
◯◯言語はここが不満

• 実行速度が遅い
• ビルド時間が長い
• 依存関係解決が面倒(Makefile, Maven)
• 型が緩過ぎてテストが面倒
• インストールしただけでは何もできない
• 並列処理を書くのが面倒
etc…



                               9
誰もが同じような
不満を抱えている



           10
Goが開発された経緯

ある日、Rob Pike、Ken Thompson、Robert
Griesemerは考えた

「今、こういう言語が求められている」
 1.   単一のマシンでも巨大なコードベースをビルド
 2.   依存関係を簡単に解決
 3.   強い型付け・柔軟・型解決も素早い型システム
 4.   GCがありマルチコアの並列性サポートする
 5.   LLな書きやすさ


                                   11
12
Agenda

今日はGoについて次のお話をします
• Goの実行環境&ビルド
• Go言語仕様
• 標準パッケージ&標準ツール
• Goを使った外部サービス
• Goの事例
• Go関連情報



                    13
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  •   実行速度
  •   ビルドの容易さ
  •   対応プラットフォーム




                                           14
実行環境とビルド
    実行速度

前提
• Goはコンパイル型言語
• コンパイルされたバイナリはプラットフォーム
  ネイティブ
• ランタイム環境はビルドされたバイナリに内包

予想
• Cよりちょっと遅いけどLLよりは十分速い?


                          15
実行環境とビルド
            実行速度
出典:The Computer Language Benchmarks Game
                                                                    LL




                                              Go




               http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.php
                                                                                             16
実行環境とビルド
                実行速度
                                                                  x64 Ubuntu Intel Q6600 quad-core

 Compared w/ C                       Go 1.0.3             Python 3.3.0             Java 7r11
    Benchmark                    Time        Code         Time         Cod       Time        Cod
                                                                        e                     e
fannkuch-redux                         2x          1/2        70x         1/2           =           =
k-nucleotide                           2x          1/2          8x        1/4           =           =
reverse-complement                     2x           2x        10x         1/2         2x           2x
pidigits                               2x            =           =        1/2        11x           2x
n-body                                 2x            =        46x           =           =           =
mandelbrot                             2x            =        78x           =           =           =
spectral-norm                          4x            =       131x           =         3x           2x
fasta                                  4x            =        88x           =         2x            =
binary-trees                         16x             =        30x           =         2x            =
regex-dna                            25x           1/4          5x        1/5         3x           1/3
           http://benchmarksgame.alioth.debian.org/u64q/benchmark.php?test=all&lang=go&lang2=gcc
                                                                                                         17
実行環境とビルド
               ビルドの容易さ

goツールで依存関係を自動解決&ビルド

ソースコード 直接レポジトリを指定 ビルド
               (git, hg, bzr, svn)
package hoge                         $   cd $GOPATH
                                     $   go get
import (                             $   go build -o main
    “github.com/foo/go-spam”         $   ./main
    “bitbucket.org/gopher/bar”
    …
)
                                         go get: 必要な全パッケージの取得
func SomeProcess(…) {…}                  go build: プロジェクトのビルド



                                                            18
実行環境とビルド
      対応プラットフォーム

CPUアーキテクチャ       OS
 – i386            –   FreeBSD 7+
                   –   Linux 2.6.23+
 – amd64
                   –   Mac OS X 10.6+
 – arm             –   Windows 2000+




           クロスコンパイルが可能!


                                        19
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  • 強い型付けかつ柔軟な型システム

  • 言語レベルでサポートされた並列化
    (goroutine & channel)


                                           20
言語仕様
           型システム

強い型付け
ダメな例
type Celsius float64
type Fahrenheit float64        型の不一致
                               c: Celsius型
func SomeFunc() Fahrenheit {   f: Fahrenheit型
    c := Celsius(100)
    f := Fahrenheit(20)

    return c + f
}




                                                   21
言語仕様
           型システム

強い型付け
良い例
type Celsius float64                   明示的に型をキャスト
type Fahrenheit float64

func (c Celsius) ToF() Fahrenheit {
    return Fahrenheit((9*c/5)+32)
}
                                       Fahrenheit型同士なの
                                       で大丈夫
func SomeFunc() Fahrenheit {
    c := Celsius(100)
    f := Fahrenheit(20)

    return c.ToF() + f
                                      http://play.golang.org/p/sVaOQioOI-
}
                                                                   22
言語仕様
           型システム

強い型付け
• ビルドが通った時点で型チェックは問題ない
• 記述量の削減につながっている
  → 型推論          型が暗黙の内にキャストさ
                          れないので、Celsius型であ
冗長な書き方                    ることが保証されている

var c1 Celsius      c1 := Celsius(100)
var c2 Celsius      c2 := Celsius(2)

c1 = Celsius(100)   c := c1 + c2
c2 = Celsius(2)

var c Celsius
c = c1 + c2
                                         23
言語仕様
            型システム

struct
Goにはクラスはありません
                                  structにはフィールドを持て
type Rectangle struct {
                                  ます
    Width int
    Length int
}
                                  structはメソッドを持てます
func (r Rectangle) Area() int {
    return r.Width * r.Length
}




                                                 24
言語仕様
               型システム

 interface
 ダックタイピングのようなことができます
type Shape interface {                   Interfaceではメソッドだけ
     Area() int
}                                        定義します

type Rectangle struct {
     Width int
     Length int                          Interfaceで定義されたメ
}                                        ソッドを実装したstruct
func (r Rectangle) Area() int {
                                         は、そのinterfaceを実装し
     return r.Width * r.Length           ているとみなされます
}

func main() {                            class Rectangle implements Shape
     r := Rectangle{Width:4, Length:3}
     fmt.Println(r.Area())
}
                                         class Rectangle(Shape)
                                                                      25
言語仕様
            型システム

interface
type Square struct {
    Length int
}                                       これもShape interfaceを実装
                                        している
func (sq Square) Area() int {
    return sq.Length * sq.Length
}

func main() {
    r := Rectangle{Width:3, Length:5}
    sq := Square{Length:2}              Interfaceにキャストもできる

    s1 := Shape(r)
    s2 := Shape(sq)
}
                                                           26
言語仕様
                   goroutine

  簡単な記述で並列(非同期)処理が可能に


同期
func Hello() {                     $ go run main.go
     fmt.Println(“はろう”)
}                                  5秒まったよ
func Waiter() {
                                   はろう
     time.Sleep(5 * time.Second)   $
     fmt.Println(“まったよ”)
}


func main() {                      順番通りに呼び出される
    Waiter()                       (予想通り)
    Hello()
}
                                   http://play.golang.org/p/qSF7AiI80P
                                                                         27
言語仕様
                   goroutine

  簡単な記述で並列(非同期)処理が可能に
非同期
var ch = make(chan string)         $ go run main.go
func Hello() {                     はろう
     fmt.Println(“はろう”)            5秒まったよ
}
                                   $
func Waiter() {
     time.Sleep(5 * time.Second)
     fmt.Println(“5秒まったよ”)
     ch <- “done”
}                                  “go”と書いて呼び出すだけで
                                   別のgoroutine上で実行され、
func main() {                      次の処理が呼び出される
    go Waiter()
    Hello()
    <-ch
}                                  http://play.golang.org/p/U2mF6jNCYp
                                                                     28
言語仕様
                  channel

    非同期な処理同士のやり取りを行うための窓口
              “Don't communicate by sharing memory,
              share memory by communicating.” – Rob Pike
  イメージ                                           コード例
                                                 func ProcessA(c chan int) {
  Process A                      Process B           …
                                                     c <- SomeProcessA()
                                                     …
                  Channel C                      }

                                                 func ProcessB(c chan int) {
                                                     …
                                                     SomeProcessB(<-c)
                                                     …
                                                 }
http://talks.golang.org/2012/concurrency.slide
                                                                               29
言語仕様
                    channel

func Bakery(store chan string) {
     for i := 1; i <= 10; i++ {                           チャンネルに値を渡す
           breadName := "bread " + strconv.Itoa(i)
           fmt.Println(breadName + "shipped to store!")
           store <- breadName                             チャンネルを閉じる
     }
     close(store)
}

func Consumer(store chan string) {
     for {
           bread, ok := <-store                           チャンネルが開いてい
           if !ok {
                break                                     る限り値を取得
           }
           fmt.Println("baught " + bread)
     }
}

func main() {
     store := make(chan string)
     fmt.Println("store open!")                           並列化
     go Bakery(store)
     go Consumer(store)
                                                          http://play.golang.org/p/6RhknPqi2d
     time.Sleep(60 * time.Second)
}                                                                                       30
言語仕様
                       channel

   非同期な処理同士のやり取りを行うための窓口
素数計算
// A concurrent prime sieve                               // The prime sieve: Daisy-chain Filter processes.
                                                          func main() {
package main                                                     ch := make(chan int) // Create a new channel.
                                                                 go Generate(ch)      // Launch Generate goroutine.
// Send the sequence 2, 3, 4, ... to channel 'ch'.               for i := 0; i < 10; i++ {
func Generate(ch chan<- int) {                                          prime := <-ch
       for i := 2; ; i++ {                                              print(prime, "n")
              ch <- i // Send 'i' to channel 'ch'.                      ch1 := make(chan int)
       }                                                                go Filter(ch, ch1, prime)
}                                                                       ch = ch1
                                                                 }
// Copy the values from channel 'in' to channel 'out',    }
// removing those divisible by 'prime'.
func Filter(in <-chan int, out chan<- int, prime int) {
       for {
             i := <-in // Receive value from 'in'.
             if i%prime != 0 {
                    out <- i // Send 'i' to 'out'.
             }
       }
}


                                                           http://play.golang.org/p/9U22NfrXeq
                                                                                            31
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  • 豊富な標準パッケージ

  • 便利な標準ツール群




                                           32
標準パッケージ
                    豊富な標準パッケージ

   “Battery included”と呼ばれるPython並
archive     crypto        database        errors         image             net                  regexp          unicode
   tar         aes           sql          expvar             color               http               syntax         utf16
   zip         cipher            driver   flag               draw                    cgi        runtime            utf8
bufio          des        debug           fmt                gif                     fcgi           cgo         unsafe
builtin        dsa           dwarf        go                 jpeg                    httptest       debug
bytes          ecdsa         elf              ast            png                     httputil       pprof
compress       elliptic      gosym            build      index                       pprof      sort
   bzip2       hmac          macho            doc            suffixarray         mail           strconv
   flate       md5           pe               parser     io                      rpc            strings
   gzip        rand       encoding            printer        ioutil                  jsonrpc    sync
   lzw         rc4           ascii85          scanner    log                     smtp               atomic
   zlib        rsa           asn1             token          syslog              textproto      syscall
container      sha1          base32       hash           math                    url            testing
   heap        sha256        base64           adler32        big           os                       iotest
   list        sha512        binary           crc32          cmplx             exec                 quick
   ring        subtle        csv              crc64          rand              signal           text
               tls           gob              fnv        mime                  user                 scanner
               x509          hex          html               multipart     path                     tabwriter
                   pkix      json             template                         filepath             template
                             pem                                           reflect                      pars
                             xml                                                                e
                                                                                                time
http://golang.org/pkg/
                                                                                                                  33
標準パッケージ
                 豊富な標準パッケージ

 準標準パッケージ
 標準ではないがコアメンバーが管理している
レポジトリ名
     crypto                              net            image
  bcrypt         otr                 dict               bmp
  blowfish       pbkdf2              html               testdata
  bn256          poly1305               atom            tiff
  cast5          ripemd160              testdata
  curve25519     salsa20                   webkit
  md4               salsa                    scripted
  nacl           scrypt              idna
     box         ssh                 ipv4
     secretbox      terminal         proxy
  ocsp              test             publicsuffix
  openpgp        twofish             spdy
     armor       xtea                websocket
     clearsign   xts
     elgamal
     errors
     packet                    https://code.google.com/p/go/source/browse?repo=xxxxx
     s2k
                                                                                  34
標準パッケージ
     便利な標準ツール群

Goでの開発を助ける標準ツール
• go build   パッケージをビルド
• go get     必要なパッケージを取得
• go install 必要なパッケージを取得&ビルド
• go run     一時的にビルドし実行
• go test    テストとベンチマークを実行
• gofmt      フォーマットを直してくれる
• godoc      ドキュメントを生成

                           35
標準パッケージ
                   便利な標準ツール群

    go test
    • xxx_test.go内のTestXxxやBenchmarkXxxとい
      う関数を実行する
コード例                                         結果
package main                                 % go test
import (
                                             PASS
           "testing"                         ok     _/…/main   0.006s
)

func TestAdd(t *testing.T) {
        const n, m = 2, 3
        const want = 6
        if out := Add(n, m); out != want {
                t.Errorf(”%v, want %v",
                            out, want)
        }
}                                                                       36
標準パッケージ
    便利な標準ツール群

gofmt       Bike Shed
• 「インデント幅は4にしろ!」「いや8だ!」
• 「ifと{の間にはスペース開けるだろ!」
• 「演算子の前後にスペースは開けるだろ!」

コミット前に“gofmt -w”と打てばいいだけ
自動化スクリプト等が同梱されているので設定しましょう



                           37
標準パッケージ
           便利な標準ツール群

godoc
GOROOTとGOPATH以下のgodocを表示するコマ
ンド

% godoc –http=“:8080”




                              38
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  • Webサービス実行環境

  • 継続テストサービスでのサポート




                                           39
外部サービス
      Google App Engine

• Google App Engine 1.5.0より採用
• Python, Javaとフレームワーク部が薄い
 – 認証やメールなど必要な機能は揃っている
• スピンアップが速い
• インターフェースが標準パッケージと同じ




             https://developers.google.com/appengine/docs/go/


                                                         40
外部サービス
                 Google App Engine

                                                         構成
                                                         myapp/
                                                           app.yaml
                 main()はGAE側で暗黙的に持                         hello/
                 つのでinit()を呼ぶ                                app.go
app.go
package hello
                                                         app.yaml
                                                         application: helloworld
import (
    "fmt"
                                                         version: 1
    "net/http"                                           runtime: go
)                                                        api_version: go1
func init() {
    http.HandleFunc("/", handler)                        handlers:
}                                                        - url: /.*
                                                           script: _go_app
func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, world!")
}                                                                            41
外部サービス
            dotCloud

dotCloudのエンジニアが動くようにした
構成                     dotcloud.yml
myapp/                 golang:
  dotcloud.yml             type: custom
    golang/                buildscript: golang/builder
       builder             processes:
    src/                       hello: ~/current/bin/hello
       hello/              ports:
         app.go                www: http
                           config:
                               build_package: hello
普通にnet/httpを使うアプリ

                       http://blog.dotcloud.com/go-on-dotcloud

                                                          42
外部サービス
     Heroku

公式にはサポートしていないが動くらしい
(やってみたらMercurialのインストールでこけた)


動いたら教えて下さい




              https://gist.github.com/kr/299535bbf56bf3016cba
                                                           43
外部サービス
          Travis CI

• 有名なCIサービス
• GitHub上のレポジトリを継続テスト
• go testを走らせるだけ

.travis.yaml の例
language: go
script: go test




                  http://about.travis-ci.org/docs/user/languages/go/
                                                                       44
外部サービス
          drone.io

• CIサービスとしてTravis CIの最右翼
• GitHub, Bitbucket, Google Codeが利用可
  – Git, Mercurial, Bazaar, Subversionを利用可
• go testを走らせるだけ

Build Commandsの例
go get
go build
go test -short




                                              45
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  •   Goを利用している事例




                                           46
事例
     vitess (YouTube)

• vitess (vtocc)
• MySQLのロードバランサ
 – YouTubeの全MySQLクエリをさばいている
 – Rowキャッシュとかもしてる
• プレゼンはここで見られます




                               47
事例
     vitess (YouTube)

• Goを採用した理由
 1. CとPythonの間で書きやすく簡潔に書ける
   • ログローテーション             105行
   • コネクションプール             227行
   • memcacheクライアント 250行
 2. ビルド&テストのサイクルが早い
 3. 標準ライブラリが豊富で楽
 4. 簡潔に書ける




                                   48
事例
           Doozer (Heroku)

• Doozer
• PaxosのGo実装

• Goを採用した理由
 1. 言語として並行性のサポート
      •    goroutine
 2.       標準パッケージが豊富
 3.       gofmt
 4.       静的リンクのバイナリ
 5.       文法が簡潔

                              49
事例
        他の大きな事例

• ngmoco:)
  – 独自HTTPサーバ & ロガー
• Canonical
  – JujuをPythonからGoに移行
• Atlassian
  – 仮想マシンクラスタのテストシステム




               https://code.google.com/p/go-wiki/wiki/GoUsers


                                                           50
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  • チュートリアル

  • 環境設定

  • コミュニティ

                                           51
情報
          チュートリアル

たいていのことは公式サイトに載っている
• A Tour of Go
  – http://tour.golang.org/
• パッケージ一覧
  – http://golang.org/pkg/
• Go公式サイト
  – http://golang.org/doc/



• 日本語訳サイト
  – http://golang.jp/

                               52
情報
       環境設定

• インストール
 – ビルド済みバイナリを入れるだけ
 – http://code.google.com/p/go/downloads/list


• 環境変数の設定
 – GOROOT
 – GOARCH
 – GOOS



                                                 53
情報
      環境設定

• ワークスペース
 – 1プロジェクトにつき1ワークスペース
 – http://golang.org/doc/code.html


• 環境変数の設定              newmath/      GOPATH
                           pkg/
 – GOPATH                      linux_amd64/
                                   example/
                                        newmath.a
• 補助ツール                    src/
                               example/
 – GVM, goenv                      newmath/
                                        sqrt.go

                                                     54
情報
       コミュニティ

• メーリングリスト
 – golang-nuts
• Google+上のコミュニティ
 – Go+
 – Golang JP




                     55
乗るしかない
このビッグウェーブに



             56
情報
         イベント告知

Go Conference 2013 spring
http://connpass.com/event/1906/




                                   57
58

More Related Content

20130228 Goノススメ(BPStudy #66)

  • 2. 自己紹介 • 山口能迪(やまぐちよしふみ) • YouTube Technical Account Manager, Google Inc. • id: ymotongpoo – とんぷーと呼ばれています 2
  • 3. 自己紹介 • Pythonが好きです • 翻訳 「Java開発者のための関数プログラミング」 オライリー・ジャパン 2012年06月発行 1,365円 (Ebook) 「Learn You Some Erlang for Great Good!」 オーム社 絶賛翻訳中 価格未定 3
  • 4. これまで使ってきた言語 • C++ 動力学計算をゴリゴリと • Java 前職で製品の拡張など • PHP 学生時代にWebサービス開発 • Python 汎用的になんでも • OCaml アルゴリズム • Go 汎用的になんでも 4
  • 5. どんな言語を使ってますか? • C • Python • Java • Ruby • Objective-C • Perl • C++ • PHP • C# • JavaScript • Erlang • Lua • Haskell • R • OCaml • Prolog • Common Lisp • Tcl 5
  • 7. ◯◯言語を使う理由 • 実行速度が速い • ビルドをしなくて済む • 煩わしい型を明記しなくてよい • テストがしやすい • Webアプリが簡単に作れる • 並列処理が簡単に書ける etc... 7
  • 9. ◯◯言語はここが不満 • 実行速度が遅い • ビルド時間が長い • 依存関係解決が面倒(Makefile, Maven) • 型が緩過ぎてテストが面倒 • インストールしただけでは何もできない • 並列処理を書くのが面倒 etc… 9
  • 11. Goが開発された経緯 ある日、Rob Pike、Ken Thompson、Robert Griesemerは考えた 「今、こういう言語が求められている」 1. 単一のマシンでも巨大なコードベースをビルド 2. 依存関係を簡単に解決 3. 強い型付け・柔軟・型解決も素早い型システム 4. GCがありマルチコアの並列性サポートする 5. LLな書きやすさ 11
  • 12. 12
  • 13. Agenda 今日はGoについて次のお話をします • Goの実行環境&ビルド • Go言語仕様 • 標準パッケージ&標準ツール • Goを使った外部サービス • Goの事例 • Go関連情報 13
  • 14. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • 実行速度 • ビルドの容易さ • 対応プラットフォーム 14
  • 15. 実行環境とビルド 実行速度 前提 • Goはコンパイル型言語 • コンパイルされたバイナリはプラットフォーム ネイティブ • ランタイム環境はビルドされたバイナリに内包 予想 • Cよりちょっと遅いけどLLよりは十分速い? 15
  • 16. 実行環境とビルド 実行速度 出典:The Computer Language Benchmarks Game LL Go http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.php 16
  • 17. 実行環境とビルド 実行速度 x64 Ubuntu Intel Q6600 quad-core Compared w/ C Go 1.0.3 Python 3.3.0 Java 7r11 Benchmark Time Code Time Cod Time Cod e e fannkuch-redux 2x 1/2 70x 1/2 = = k-nucleotide 2x 1/2 8x 1/4 = = reverse-complement 2x 2x 10x 1/2 2x 2x pidigits 2x = = 1/2 11x 2x n-body 2x = 46x = = = mandelbrot 2x = 78x = = = spectral-norm 4x = 131x = 3x 2x fasta 4x = 88x = 2x = binary-trees 16x = 30x = 2x = regex-dna 25x 1/4 5x 1/5 3x 1/3 http://benchmarksgame.alioth.debian.org/u64q/benchmark.php?test=all&lang=go&lang2=gcc 17
  • 18. 実行環境とビルド ビルドの容易さ goツールで依存関係を自動解決&ビルド ソースコード 直接レポジトリを指定 ビルド (git, hg, bzr, svn) package hoge $ cd $GOPATH $ go get import ( $ go build -o main “github.com/foo/go-spam” $ ./main “bitbucket.org/gopher/bar” … ) go get: 必要な全パッケージの取得 func SomeProcess(…) {…} go build: プロジェクトのビルド 18
  • 19. 実行環境とビルド 対応プラットフォーム CPUアーキテクチャ OS – i386 – FreeBSD 7+ – Linux 2.6.23+ – amd64 – Mac OS X 10.6+ – arm – Windows 2000+ クロスコンパイルが可能! 19
  • 20. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • 強い型付けかつ柔軟な型システム • 言語レベルでサポートされた並列化 (goroutine & channel) 20
  • 21. 言語仕様 型システム 強い型付け ダメな例 type Celsius float64 type Fahrenheit float64 型の不一致 c: Celsius型 func SomeFunc() Fahrenheit { f: Fahrenheit型 c := Celsius(100) f := Fahrenheit(20) return c + f } 21
  • 22. 言語仕様 型システム 強い型付け 良い例 type Celsius float64 明示的に型をキャスト type Fahrenheit float64 func (c Celsius) ToF() Fahrenheit { return Fahrenheit((9*c/5)+32) } Fahrenheit型同士なの で大丈夫 func SomeFunc() Fahrenheit { c := Celsius(100) f := Fahrenheit(20) return c.ToF() + f http://play.golang.org/p/sVaOQioOI- } 22
  • 23. 言語仕様 型システム 強い型付け • ビルドが通った時点で型チェックは問題ない • 記述量の削減につながっている → 型推論 型が暗黙の内にキャストさ れないので、Celsius型であ 冗長な書き方 ることが保証されている var c1 Celsius c1 := Celsius(100) var c2 Celsius c2 := Celsius(2) c1 = Celsius(100) c := c1 + c2 c2 = Celsius(2) var c Celsius c = c1 + c2 23
  • 24. 言語仕様 型システム struct Goにはクラスはありません structにはフィールドを持て type Rectangle struct { ます Width int Length int } structはメソッドを持てます func (r Rectangle) Area() int { return r.Width * r.Length } 24
  • 25. 言語仕様 型システム interface ダックタイピングのようなことができます type Shape interface { Interfaceではメソッドだけ Area() int } 定義します type Rectangle struct { Width int Length int Interfaceで定義されたメ } ソッドを実装したstruct func (r Rectangle) Area() int { は、そのinterfaceを実装し return r.Width * r.Length ているとみなされます } func main() { class Rectangle implements Shape r := Rectangle{Width:4, Length:3} fmt.Println(r.Area()) } class Rectangle(Shape) 25
  • 26. 言語仕様 型システム interface type Square struct { Length int } これもShape interfaceを実装 している func (sq Square) Area() int { return sq.Length * sq.Length } func main() { r := Rectangle{Width:3, Length:5} sq := Square{Length:2} Interfaceにキャストもできる s1 := Shape(r) s2 := Shape(sq) } 26
  • 27. 言語仕様 goroutine 簡単な記述で並列(非同期)処理が可能に 同期 func Hello() { $ go run main.go fmt.Println(“はろう”) } 5秒まったよ func Waiter() { はろう time.Sleep(5 * time.Second) $ fmt.Println(“まったよ”) } func main() { 順番通りに呼び出される Waiter() (予想通り) Hello() } http://play.golang.org/p/qSF7AiI80P 27
  • 28. 言語仕様 goroutine 簡単な記述で並列(非同期)処理が可能に 非同期 var ch = make(chan string) $ go run main.go func Hello() { はろう fmt.Println(“はろう”) 5秒まったよ } $ func Waiter() { time.Sleep(5 * time.Second) fmt.Println(“5秒まったよ”) ch <- “done” } “go”と書いて呼び出すだけで 別のgoroutine上で実行され、 func main() { 次の処理が呼び出される go Waiter() Hello() <-ch } http://play.golang.org/p/U2mF6jNCYp 28
  • 29. 言語仕様 channel 非同期な処理同士のやり取りを行うための窓口 “Don't communicate by sharing memory, share memory by communicating.” – Rob Pike イメージ コード例 func ProcessA(c chan int) { Process A Process B … c <- SomeProcessA() … Channel C } func ProcessB(c chan int) { … SomeProcessB(<-c) … } http://talks.golang.org/2012/concurrency.slide 29
  • 30. 言語仕様 channel func Bakery(store chan string) { for i := 1; i <= 10; i++ { チャンネルに値を渡す breadName := "bread " + strconv.Itoa(i) fmt.Println(breadName + "shipped to store!") store <- breadName チャンネルを閉じる } close(store) } func Consumer(store chan string) { for { bread, ok := <-store チャンネルが開いてい if !ok { break る限り値を取得 } fmt.Println("baught " + bread) } } func main() { store := make(chan string) fmt.Println("store open!") 並列化 go Bakery(store) go Consumer(store) http://play.golang.org/p/6RhknPqi2d time.Sleep(60 * time.Second) } 30
  • 31. 言語仕様 channel 非同期な処理同士のやり取りを行うための窓口 素数計算 // A concurrent prime sieve // The prime sieve: Daisy-chain Filter processes. func main() { package main ch := make(chan int) // Create a new channel. go Generate(ch) // Launch Generate goroutine. // Send the sequence 2, 3, 4, ... to channel 'ch'. for i := 0; i < 10; i++ { func Generate(ch chan<- int) { prime := <-ch for i := 2; ; i++ { print(prime, "n") ch <- i // Send 'i' to channel 'ch'. ch1 := make(chan int) } go Filter(ch, ch1, prime) } ch = ch1 } // Copy the values from channel 'in' to channel 'out', } // removing those divisible by 'prime'. func Filter(in <-chan int, out chan<- int, prime int) { for { i := <-in // Receive value from 'in'. if i%prime != 0 { out <- i // Send 'i' to 'out'. } } } http://play.golang.org/p/9U22NfrXeq 31
  • 32. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • 豊富な標準パッケージ • 便利な標準ツール群 32
  • 33. 標準パッケージ 豊富な標準パッケージ “Battery included”と呼ばれるPython並 archive crypto database errors image net regexp unicode tar aes sql expvar color http syntax utf16 zip cipher driver flag draw cgi runtime utf8 bufio des debug fmt gif fcgi cgo unsafe builtin dsa dwarf go jpeg httptest debug bytes ecdsa elf ast png httputil pprof compress elliptic gosym build index pprof sort bzip2 hmac macho doc suffixarray mail strconv flate md5 pe parser io rpc strings gzip rand encoding printer ioutil jsonrpc sync lzw rc4 ascii85 scanner log smtp atomic zlib rsa asn1 token syslog textproto syscall container sha1 base32 hash math url testing heap sha256 base64 adler32 big os iotest list sha512 binary crc32 cmplx exec quick ring subtle csv crc64 rand signal text tls gob fnv mime user scanner x509 hex html multipart path tabwriter pkix json template filepath template pem reflect pars xml e time http://golang.org/pkg/ 33
  • 34. 標準パッケージ 豊富な標準パッケージ 準標準パッケージ 標準ではないがコアメンバーが管理している レポジトリ名 crypto net image bcrypt otr dict bmp blowfish pbkdf2 html testdata bn256 poly1305 atom tiff cast5 ripemd160 testdata curve25519 salsa20 webkit md4 salsa scripted nacl scrypt idna box ssh ipv4 secretbox terminal proxy ocsp test publicsuffix openpgp twofish spdy armor xtea websocket clearsign xts elgamal errors packet https://code.google.com/p/go/source/browse?repo=xxxxx s2k 34
  • 35. 標準パッケージ 便利な標準ツール群 Goでの開発を助ける標準ツール • go build パッケージをビルド • go get 必要なパッケージを取得 • go install 必要なパッケージを取得&ビルド • go run 一時的にビルドし実行 • go test テストとベンチマークを実行 • gofmt フォーマットを直してくれる • godoc ドキュメントを生成 35
  • 36. 標準パッケージ 便利な標準ツール群 go test • xxx_test.go内のTestXxxやBenchmarkXxxとい う関数を実行する コード例 結果 package main % go test import ( PASS "testing" ok _/…/main 0.006s ) func TestAdd(t *testing.T) { const n, m = 2, 3 const want = 6 if out := Add(n, m); out != want { t.Errorf(”%v, want %v", out, want) } } 36
  • 37. 標準パッケージ 便利な標準ツール群 gofmt Bike Shed • 「インデント幅は4にしろ!」「いや8だ!」 • 「ifと{の間にはスペース開けるだろ!」 • 「演算子の前後にスペースは開けるだろ!」 コミット前に“gofmt -w”と打てばいいだけ 自動化スクリプト等が同梱されているので設定しましょう 37
  • 38. 標準パッケージ 便利な標準ツール群 godoc GOROOTとGOPATH以下のgodocを表示するコマ ンド % godoc –http=“:8080” 38
  • 39. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • Webサービス実行環境 • 継続テストサービスでのサポート 39
  • 40. 外部サービス Google App Engine • Google App Engine 1.5.0より採用 • Python, Javaとフレームワーク部が薄い – 認証やメールなど必要な機能は揃っている • スピンアップが速い • インターフェースが標準パッケージと同じ https://developers.google.com/appengine/docs/go/ 40
  • 41. 外部サービス Google App Engine 構成 myapp/ app.yaml main()はGAE側で暗黙的に持 hello/ つのでinit()を呼ぶ app.go app.go package hello app.yaml application: helloworld import ( "fmt" version: 1 "net/http" runtime: go ) api_version: go1 func init() { http.HandleFunc("/", handler) handlers: } - url: /.* script: _go_app func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Hello, world!") } 41
  • 42. 外部サービス dotCloud dotCloudのエンジニアが動くようにした 構成 dotcloud.yml myapp/ golang: dotcloud.yml type: custom golang/ buildscript: golang/builder builder processes: src/ hello: ~/current/bin/hello hello/ ports: app.go www: http config: build_package: hello 普通にnet/httpを使うアプリ http://blog.dotcloud.com/go-on-dotcloud 42
  • 43. 外部サービス Heroku 公式にはサポートしていないが動くらしい (やってみたらMercurialのインストールでこけた) 動いたら教えて下さい https://gist.github.com/kr/299535bbf56bf3016cba 43
  • 44. 外部サービス Travis CI • 有名なCIサービス • GitHub上のレポジトリを継続テスト • go testを走らせるだけ .travis.yaml の例 language: go script: go test http://about.travis-ci.org/docs/user/languages/go/ 44
  • 45. 外部サービス drone.io • CIサービスとしてTravis CIの最右翼 • GitHub, Bitbucket, Google Codeが利用可 – Git, Mercurial, Bazaar, Subversionを利用可 • go testを走らせるだけ Build Commandsの例 go get go build go test -short 45
  • 46. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • Goを利用している事例 46
  • 47. 事例 vitess (YouTube) • vitess (vtocc) • MySQLのロードバランサ – YouTubeの全MySQLクエリをさばいている – Rowキャッシュとかもしてる • プレゼンはここで見られます 47
  • 48. 事例 vitess (YouTube) • Goを採用した理由 1. CとPythonの間で書きやすく簡潔に書ける • ログローテーション 105行 • コネクションプール 227行 • memcacheクライアント 250行 2. ビルド&テストのサイクルが早い 3. 標準ライブラリが豊富で楽 4. 簡潔に書ける 48
  • 49. 事例 Doozer (Heroku) • Doozer • PaxosのGo実装 • Goを採用した理由 1. 言語として並行性のサポート • goroutine 2. 標準パッケージが豊富 3. gofmt 4. 静的リンクのバイナリ 5. 文法が簡潔 49
  • 50. 事例 他の大きな事例 • ngmoco:) – 独自HTTPサーバ & ロガー • Canonical – JujuをPythonからGoに移行 • Atlassian – 仮想マシンクラスタのテストシステム https://code.google.com/p/go-wiki/wiki/GoUsers 50
  • 51. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • チュートリアル • 環境設定 • コミュニティ 51
  • 52. 情報 チュートリアル たいていのことは公式サイトに載っている • A Tour of Go – http://tour.golang.org/ • パッケージ一覧 – http://golang.org/pkg/ • Go公式サイト – http://golang.org/doc/ • 日本語訳サイト – http://golang.jp/ 52
  • 53. 情報 環境設定 • インストール – ビルド済みバイナリを入れるだけ – http://code.google.com/p/go/downloads/list • 環境変数の設定 – GOROOT – GOARCH – GOOS 53
  • 54. 情報 環境設定 • ワークスペース – 1プロジェクトにつき1ワークスペース – http://golang.org/doc/code.html • 環境変数の設定 newmath/ GOPATH pkg/ – GOPATH linux_amd64/ example/ newmath.a • 補助ツール src/ example/ – GVM, goenv newmath/ sqrt.go 54
  • 55. 情報 コミュニティ • メーリングリスト – golang-nuts • Google+上のコミュニティ – Go+ – Golang JP 55
  • 57. 情報 イベント告知 Go Conference 2013 spring http://connpass.com/event/1906/ 57
  • 58. 58

Editor's Notes

  1. そうだ、Goを作ろう!
  2. http://benchmarksgame.alioth.debian.org/u32q/benchmark.php?test=all&amp;lang=go&amp;lang2=gcchttp://blog.jgc.org/2012/05/to-boldly-go-where-node-man-has-gone.htmlhttp://areyoufuckingcoding.me/2012/08/16/parallelism-for-the-win/ただのアルゴリズムベンチマークでしか無いが、速度はJavaに匹敵、コード記述量はPython並。実際のコードはライブラリ等を使う速度や記述力であることを加味してほしい。
  3. 147の標準パッケージcrypto: 暗号化関係encoding: フォーマット関係image: 画像関係net: 通信関係testing: テストgo: Goのソースコード解析など
  4. 全部紹介するのは大変なので下の3つだけ紹介
  5. go build
  6. http://blog.dotcloud.com/go-on-dotcloud
  7. https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/V0U8LS_gdYw
  8. https://www.usenix.org/conference/lisa12/vitess-scaling-mysql-youtube-using-go
  9. https://www.usenix.org/conference/lisa12/vitess-scaling-mysql-youtube-using-go動画ではビルドは3秒で終わると言っている他にもconcurrencyとcgoについて触れていた
  10. Paxosは、信頼性の低い複数の処理ノードによるネットワークで「コンセンサス」を得るための各種手順Paxos自体は汎用的なアルゴリズムでさまざまな問題に適用できますが、最近のNoSQLの文脈で語られるのは「データストアをマルチマスター構成にしたときに、どうやってデータの整合性を効率的に確保するか」って問題へのPaxos応用です。Paxosは独立した並列なプロセスをメッセージパッシングで行うので、goroutine &amp; channelがはまったwebsocketとか便利だった(いまは準標準パッケージ)無駄な議論をしなくて済むようになったデプロイがすごく楽簡潔に書けてとてもよい
  11. Jujuは「サービス実装・オーケストレーションフレームワーク」と呼ばれる管理ツールで、複数の物理/仮想サーバーを一括管理できる。
  12. 日本語訳サイトは結構頑張って本体に追いついています