1 of 32

Go 1.5での新機能

Yoshifumi Yamaguchi

Aug. 11, 2015 (Tue) Go言語勉強会

2 of 32

お前だれよ

  • 山口能迪(やまぐちよしふみ)
  • @ymotongpoo

とんぷーと呼ばれています

  • Developer Advocate, Google
    • 新しいバージョンやサービスと連携してくれる企業の支援
    • Android Wear, Chromecast, Google Now, YouTube…

  • イカの本を翻訳しました →→→→→→→→

3 of 32

4 of 32

5 of 32

GopherCon 2015の資料

読んできた人いますか?

6 of 32

読んできた人は

一人ジャンケンを

楽しんでてください

7 of 32

Go 1.5

  • 2015/08/10現在で 1.5 rc1

  • 公式にはまだドキュメントはでてない

8 of 32

Talks/docs about Go 1.5 so far

  • http://talks.golang.org/2015/gogo.slide
    • by Rob Pike; C実装をなくした話

9 of 32

Highlights

10 of 32

これまでのリリースノート

11 of 32

Preface of Go 1.5 Release Note

“A significant release”

12 of 32

Major updates

大きく取り上げてたもの

  • gcとランタイムをGo自身で実装
    • C言語の実装がなくなった
  • コンカレントGC
  • デフォルトで GOMAXPROCS がCPU数
  • internalパッケージ
  • vendoringのサポート
  • go tool trace
  • go docでCLIむけ新機能

13 of 32

Major updates

リリースノートにはさりげなく書いてあったもの

  • 共有ライブラリの生成
    • -buildmode=shared/c-shared
  • 共有ライブラリのリンク
    • -linkshared オプション

14 of 32

golang.org/x/mobile

  • Go Mobile project
    • golang.org/x/mobile
    • gomobile コマンドからAndroid/iOSアプリの生成
      • ネイティブアプリ、ライブラリ両方の用途に(一応)使える
    • Go 1.5で共有ライブラリが作れるようになって進展

15 of 32

Topics

16 of 32

セルフホスティング

  • Go 1.5のビルドにGo 1.4が必要(Go 1.4.2)

  • ビルド済みバイナリを使ったほうがいい

$ git clone https://go.googlesource.com/go go1.5

$ cd go1.5/src

$ GOROOT_BOOTSTRAP=/path/to/go1.4.2/ ./make.bash

17 of 32

コンカレントGC

  • https://goo.gl/k4mZxm
    • Goのコンパイラを書いているAustin Clementsによる資料
    • コンカレントGCのペーシングの説明

  • https://talks.golang.org/2015/go-gc.pdf
    • GopherCon 2015でのRick Hudsonによる発表
    • Go 1.4と比較してのGCのパフォーマンスの評価

Austin Clements, Rick Hudson, Russ Coxはキューブメイト→

18 of 32

コンカレントGC

  • おさらい:GoのGCは基本 mark & sweep
  • Go 1.4 : stop the world

19 of 32

コンカレントGC

  • Go 1.5 : Concurrent GC

20 of 32

GCのパフォーマンス

21 of 32

共有ライブラリの生成

C形式とGo形式の2つがある

  • C形式 : -buildmode=c-shared
  • Go形式 : -buildmode=shared

資料: https://goo.gl/COEkIJ

  • Ian Lance TaylorによるGoで生成したバイナリの実行形式に関する資料

22 of 32

共有ライブラリの生成

linux/amd64

linux/arm

darwin/amd64

darwin/arm

c-shared

shared

×

2015/08/10時点でのGo 1.5での対応予定

23 of 32

C形式の共有ライブラリ

サンプル: https://goo.gl/0b5AuH

  • mainパッケージのみ
  • C パッケージのimport
  • //export <関数名> のコメント
    • <関数名> はGoでの宣言と一致させる
  • 空でいいのでmain関数を宣言

24 of 32

package main

import (

"C"

"log"

"net/http"

)

//export server

func server() {

http.HandleFunc("/", handler)

log.Fatal(http.ListenAndServe(":8080", nil))

}

func handler(w http.ResponseWriter, r *http.Request) {

w.Write([]byte("Hello, Go c-shared lib"))

}

func init() {

log.Println("Go HTTP server is loaded")

}

// mainは必須

func main() {}

main.go

$ go build -buildmode=c-shared -o libgomain.so main.go

25 of 32

Go形式の共有ライブラリ

  • -buildmode=shared
    • go build -linkshared でリンク
  • Go 1.5ではlinux/amd64でのみサポート予定
    • rev:546836 では動かない

26 of 32

go doc

  • godoc ではありません!
  • godoc よりも簡潔で使いやすいCLIコマンド
  • godoc はこれまでどおりHTMLドキュメントなどの生成に

27 of 32

go doc

godoc

go doc

28 of 32

internal

  • パッケージ内に internal というディレクトリがあると、その中は公開しない形になる
  • Go 1.4では標準ライブラリでは使えていた
  • Go 1.5で3rd partyでも使えるようになった
    • 嬉しい嬉しい!!!

29 of 32

vendoring

  • 「Goではバージョンが固定できないんですか!?」
  • 多くの議論がなされてきた
  • https://golang.org/s/go15vendor
    • 開発者用ML(golang-dev)の議論を元にRuss Coxが提案
    • vendor という名前のディレクトリの下に依存するライブラリのソースを丸ごと追加して公開
    • vendor 以下がVCSクローンよりも優先される
    • 現状は実験的機能なので GO15VENDOREXPERIMENT=1 で有効化

30 of 32

vendoring

$GOPATH

| src/

| | github.com/constabulary/example-gsftp/

| | | cmd/

| | | | gsftp/

| | | | | main.go

| | | vendor/

| | | | github.com/pkg/sftp/

| | | | golang.org/x/crypto/ssh/

| | | | | agent/

31 of 32

Go Mobile

32 of 32

おしらせ