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"] = 2m[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が實行される。