【Go】そろそろ一齧り?! | さすらいびとの徒然漂流記

さすらいびとの徒然漂流記

ふらふら漂流するさすらいびとのように,色々な話題についてお気楽極楽,徒然なるままに…

ということで,前回 の続き.


一通り仕様を読んでみて面白かったところとか

気になったところをランダムにピックアップ.


他にも面白いとかあるかもしれないけど,

主観的なものってことで.



・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++の次の狙うプリミティブな言語だから

ErlangScala みたいに

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例外捕捉みたいだね.

特にrecoverdeferのclosureで使うって感じ.


func P() {

panic(hoge)

}


func F() {

defer func() {

x := recover()

if x == hoge {

// hogeの例外処理

} // end if

} // end defer

P()

} // end F



・main.main

プログラムの起点packagemainmain関数ってこと.


package main


func main() { ... }



果たして,この言語って流行るのか否か.