初めてのgolang



株式会社トップゲート@sinmetal



agenda

  1. 自己紹介
  2. golangって?
  3. golangで動いているもの
  4. golangの動かし方
  5. golangの開発環境
  6. golangの文法とか
  7. 情報源

自己紹介

株式会社トップゲート GAEマイスター


Java, GAE, slim3

golangって?


  • オープンソース
  • 主な舵取りはgoogle
  • 2009年11月10日(米国時間) googleより発表
  • 現在のVersionはgo1.2.
  • 目指している所は早さ。実行速度もコンパイル速度も。
  • タイプセーフ
  • メモリセーフ
  • 並列処理の記述が容易




gopher

golangで動いているもの

    google社内ではいろんなものをgolangに置き換えているらしい

    youtubeの裏で使っているMySqlのスケーリングをするためのもの

    (僕はよく知らないので、ちょっとここに行って勉強してくる)

    golangで作られているものの一覧
    WebApp, Game Serverなど色んなものがある

golangの動かし方


ちょっと試すだけなら、A Tour of Go or Go Playground

golangの開発環境

Hello World

package main
import "fmt" 

func main() {
    var m1 string = "Hello world!" // 変数は 変数名 型の順番で宣言
    m2 := "Hello Go!" // := で型推論
    fmt.Println(m1)
    fmt.Println(m2)
}

セミコロン




基本的には要らない

キーワード (1)

  • break : for, switch, select から抜ける
  • case : switch, select のcase
  • chan : チャネル
  • const : 定数
  • continue : for文で次の繰り返しを開始する
  • default : switch, selectのdefault
  • defer : 関数を遅延実行
  • else : if の分岐
  • fallthrough : switch, select, caseで次のcaseを続けて実行
  • for : ループ
  • func : 関数
  • go : 関数をgoroutineとして実行
  • goto : ラベルにジャンプ
  • if : 条件分岐
  • import : 他のpackageの利用を宣言

キーワード (2)

  • interface : インタフェース
  • map : マップ
  • package : ソースファイルが所属するpackage
  • range : forで配列などから値を順番に取得する
  • return : 関数から呼び出し元に戻る
  • select : チャネル送受信による分岐
  • struct : 構造体
  • switch : 条件分岐
  • type :
  • var : 変数

繰り返しはforしか無い

package main

import "fmt"

func main() {
    for i := 1; i <= 151; i++ {
        fmt.Println(i, "番目のポケモン!")
    }
}




Classは無い




extendsも無い

typeにメソッドを持たせる

type Favorite struct {
Id          string    `json:"id" datastore:"-"`
PokemonName string    `json:"pokemonName"`
Created     time.Time `json:"created"`
}

func (f *Favorite) save(c appengine.Context) (*Favorite, error) {
f.Created = time.Now()
k, err := datastore.Put(c, f.key(c), f)
if err != nil {
return nil, err
}
f.Id = k.StringID()
return f, nil
}


packageを作る

package pokemon
...
type pokemon struct {
    Id int64 `json:"id"`
    Name string `json:"name"`
}

func GetHeroes() {  // 先頭大文字がpublic
    pokemons := [3]Pokemon{}
    pokemons[0] = Pokemon{Id: 1, Name: "フシギダネ"}
    pokemons[1] = Pokemon{Id: 2, Name: "ゼニガメ"}
    pokemons[2] = Pokemon{Id: 3, Name: "ヒトカゲ"}

    return pokemons, nil
}



Exceptionは無い



Errorは戻り値として返す

複数戻り値可能

func (f *Favorite) save(c appengine.Context) (*Favorite, error) {
f.Created = time.Now()
k, err := datastore.Put(c, f.key(c), f)  // Key, Errorが返ってくる
if err != nil {
return nil, err
}
f.Id = k.StringID()
return f, nil
}

panic

package main

func main() {
    panic("ヤドランが突破できない")
}

recover

package main

import "fmt"

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("リカバリ:", err)
        }
    }()
    panic("パニック!")
}

基本型 (1)

  • bool
  • string
  • uint8
  • byte
  • uint16
  • uint32
  • uint64

基本型 (2)

  • int8
  • int16
  • int32
  • rune : int32のalias。Unicoe文字1文字を格納する型。文字のことをルーンと呼ぶ。
  • int64
  • float32
  • float64
  • complex64 : 複素数
  • complex128 : 複素数
  • uint : サイズはシステム環境に依存。32bit or 64bit
  • int : サイズはシステム環境に依存。32bit or 64bit
  • uintptr : ポインタの値を格納するための符号なし整数。

情報源

初めてのgolang

By sinmetal

初めてのgolang

  • 6,662