ということで,前回 の続き.
一通り仕様を読んでみて面白かったところとか
気になったところをランダムにピックアップ.
他にも面白いとかあるかもしれないけど,
主観的なものってことで.
・variable name
最初が大文字でパッケージ内だと他のパッケージに公開されるみたい.
メンバの場合は型がパッケージ内で命名は同じルール.
・blank identifier
記述としては"_"(アンダースコア)のこと.
これを左辺値として代入に用いると値を捨てる意味になる.
例えば,coordinate関数が3次元座標の値を返す場合,
var x, y, _ = coordinate(shape)
とすると,3つ目の座標値を捨てることになる.
ブランク識別子は複数可能なので,
上の例でzのみなら,
var _, _, z = coordinate(shape)
となる.
・channel again
どうやら並行処理におけるチャネルってことで良いらしい.
しかし,C++のポインタ変数のメンバ参照のように"->"を
使わないんだから,これの方が良かったのにね.
こんな感じで.
sender<- v1
receiver-> v2
それはともかく,後置だと二項演算子で送信,
前置だと単項演算子で受信ってことだね.
sender<- v1
v2 <-receiver
・method & function call
メソッド呼び出しの代わりに関数呼び出しの第一引数に
receiverを指定するのも可能らしい.
var t T
t.Func1()
T.Func1(t)
・switch
breakが必要ないみたいだね.
代わりにfallthroughがあるっぽい.
それに,caseには複数の条件を","で並べられる.
評価順序も左から右,上から下と決まっている.
switch hoge {
case 1, 2: x = "a"
case 3, 4: x = "b"
default: x = "z"
}
他にもswitchの条件を省略すると「常に真」と評価され,
caseの評価に入るってことらしい.
あと,構文的には別のtype switchと言うものあって,
型の分岐もできる.
・select
channel用のswitchってことみたいだね.
何かSpin のPromelaを思い出すよ,やっぱり.
・go
並行プログラミングが特徴と言うことで,
スレッド生成に用いる構文が言語にある.
go Process1()
go func(a int) { println(a); } (1)
C/C++の次の狙うプリミティブな言語だから
actor modelって訳には行かなかったのかな.
・defer
LIFOでこの式がある関数が終了時に実行される
式を定義する構文ってことだね.
Javaのfinallyみたいな処理や
事後条件のアサーションとかがわかり易い例かな.
defer Assert(x == 0)
・複数の返値
複数の返り値が返せるっていうのは前回 書いたけど,
2パターンあるみたい.
一つ目はreturn文に並べる方法で,
return a, b, c
もう一つは,result parameterに設定する方法で,
func F1() (a int, b float, c string) {
a = 1
b = 1.0
c = "aaa"
return
}
C#とかの "out" 指定でもいい気がするけど,
キーワードを増やしたくなかったのかな?
・panic & recover
panicは例外通知,recoverは例外捕捉みたいだね.
特にrecoverはdeferのclosureで使うって感じ.
func P() {
panic(hoge)
}
func F() {
defer func() {
x := recover()
if x == hoge {
// hogeの例外処理
} // end if
} // end defer
P()
} // end F
・main.main
プログラムの起点はpackageがmainのmain関数ってこと.
package main
func main() { ... }
果たして,この言語って流行るのか否か.