GDD2010:プログラミング言語 Go

プログラミング言語 Go
鵜飼 文敏

Go言語とは何か
  • 2009年11月10日にオープンソース公開
    • コントリビュートしてるのは125名(2010/09)
  • 特徴

主流なプログラミング言語C++Java)、
ライトウェイト言語(Python,Rubyなど)

これらの良い点を取り入れた特徴

    • 静的片付け、型安全
    • ダックタイピング、
    • 短いコンパイル時間
    • 大規模プログラミング可能
    • ネットワーキング
    • マルチコア
godentaku - Goで作った電卓

四則演算のパッケージはすでに揃っているが、あえて処理を書くことでプログラムを理解する。

  • 入力:bufio

func (*Reader) ReadBytes


packageを調べれば、こうした関数が調べれる。
godocというドキュメント
引数の型などを確認できる。


複数の値を返せるのがgoの特徴。

  • 出力:fmt

func Printf


いわゆるprintf
"%v"与えられた変数に応じた最適な表示を行うフォーマット指定

% 6g main.go  →64bit用コンパイル


6.out
実行バイナリ

  • int
    • ビット長を明確に指定しないと計算してくれない。
      • 違う型でも演算してしまって起こるエラーを防ぐため
  • sliceは配列に使うポインタ
    • 長さを変えられる配列

nbuf = buf[1:]


   →参照をひとつ進めて代入


   string(buf[0:i])

  配列はデータであり、
  stringとして参照するときはimmutableな配列に内部的に変換して表示に使われる。
  文字列は基本的にはUTF-8文字コードが前提

  • interface: Ast

type Ast interface {
String() string
Eval(env* Env) Ast
}


あるメソッドを備えたオブジェクトを受け取れる型
Ast型にの変数に代入できるのは、これらのメソッドが定義されている型のオブジェクト
Astにいれて使う方はこれらのメソッドを定義する。

演算は型をそろえないとコンパイルエラーになる。
実は、メモリ内では同じ扱いになったりするのだが、
コンパイラ、実行時はちゃんと評価してはじく。

  • map: variable table
    • いわゆるハッシュテーブル
    • intやstringをキーにして値参照できる。
    • そのmapにキーに相当する値があるかどうかを確かめるには、2つの受け取り用変数でmapを参照する

  (例)
  if v, found := map[hoge]

  • interfaceのメモリ内での扱い
    • 2つのポインタから成る。
    • データへのポインタと、Itabという型情報&メソッドのポインタ
    • intのように、わざわざ型情報を持つのがもったいない場合は、データのポインタにintの型情報が入っている。
  • interface type-switch

(例)
  if sym, ok := stmt.(Symbol);

  • 例外処理

 defer func() { ... }


その関数を呼ばれる前にかならず呼ばれる処理を実装することができる。
try, catchに相当する処理を実装するときに使う、

  • packageにする
    • ファイルを分割する
    • メインのファイル
      • import に"./godentaku"
      • godentaku.Read(line)
    • パッケージのファイル
      • package godentaku
      • 大文字で始まるとグローバルに参照できる。小文字で始まる場合はパッケージ内だけで参照できる。
    • 標準パッケージにコントリビュートする
      • codereviewでレビューしてもらう必要がある
    • googlecode でパッケージ公開