A Tour of Go (日本語版)を讀んだ際の覺書。
Goのプログラムをサーバで受取り、コンパイル、リンク、實行して結果を返す仕組み。
以下の制限が有る。
- 標準ライブラリが使用出來る。
- ネットワークアクセスは出來ない。
- ファイルアクセスも出來ない。
- 日時は常に 2009-11-10 23:00:00 UTC で固定される。
- マルチスレッドは使へない。
- パッケージ名はインポートパスの最後の要素と同じ。
math/rand
パッケージはpackage rand
で始まるファイル群で構成される。code.google.com/p/go.net/websocket
ならpackage websocket
で始まるファイル群で構成される.
- 頭文字が大文字の名前は 外部へ公開 される。
- 小文字の名前は公開されない。
var
宣言は凾數内外で使用出來る。:=
は凾數内でしか使用出來ない。
var x, y float64 = 1.2, 1.4
i, j := 3, 4
- 定數は
const
キーワードを使用して定義する。 - 定數に出來るのは以下の四つ。
- character
- string
- boolean
- numeric (數値)
new(T)
はTを ゼロ初期化 してそのポインタを返す。
vat t *T = new(T)
t := new(T)
- slice は
make
凾數で生成する。
a := make([]int, 4, 5)
// len(a) = 4
// len(a) = 5
- slice の初期値は
nil
となる。nil
の slice は length と cpacity が0。
- 二重 slice :
m := maake([][]int, 5, 5)
で length と capacity が5の[]int
のslice が生成される。
- map は
make
凾數で生成する。 string
とint
のマップの例。
m := make(map[string]int)
m["a"] = 1
m["b"] = 2
m[key] = value
--map
への要素の插入・更新。value = m[key]
-- 要素の抽出。delete(m, key)
-- 要素の削除。value, ok = m[key]
-- キーの存在確認。要素が存在すればok
はture
になる。
- Go の凾數はクロージャ( closure )。
- Go の
swith
にはbreak
がない。 - 次の
case
に通したい場合はfallthrough
文をcase
の末尾に記述する。
- 條件のない
switch
は 長いif-then-else
の代はりになる。
t := time.Now()
swith {
case t.Hour() < 12:
fmt.Println("朝だよ")
case t.Hour() < 17:
fmt.Println("晝だよ")
default:
fmt.Println("夜だよ")
}
- インターフェース型( interface type )はメソッド群で定義される。
- 或る型 T に
func (t T) Error() string
と云ふメソッドが實裝されてゐれば、其乃型は interface typeerror
を滿たす。
io.Reader
は以下のやうなインターフェース型。
type Reader interface {
Read(p []byte) (n int, err error)
}
Read
は讀込んだバイト數を返す。err == nil
の時は正常。err != nil
の時は何らかのエラー。err == EOF
の時はファイルの末尾。
- guncip みたいなフィルタのサンプル。
package main
import (
"compress/gzip"
"io"
"os"
)
func main() {
reader, _ := gzip.NewReader(os.Stdin)
io.Copy(os.Stdout, reader)
}
- チャネル( channel )は
make
で生成する。
ch := make(chan int)
ch <- v // vをチャネルchへ送る。
v := <-ch // chから受信して變數vへ割當てる。
- デフォルトでは送受信は ブロック される。
- チャネルはバッファ出來る。
- バッファの長さは
make
の第二引數で指定する。 - バッファの長さは
cap
で取得する。
ch := make(chan int, 100)
//cap(ch) == 100
- バッファが滿杯の状態で更に送信を行ふとエラーになる。
fatal error: all goroutines are asleep - deadlock!
- 受信式に第二變數を與へる事でチャネルが閉じてゐるか確認可能。
v, ok := <- ch
// ok == true // 閉じてゐない
// ok == false // 閉じてゐる
range
を使つてチャネルから繰返し受信する事が出來る。range
でインデックスを取得する事は出來ない。
for v := range c {
// do something
}
select
はgoroutine
を複數の通信操作で待たせる。- 複數の
case
が一致した場合、ランダムに一つが擇ばれる。
select
でどのcase
にも一致しない場合、default
が實行される。