Go言語にざっと触れるには良い本です。
コード書いて動かしてみましたが、2,3時間で済みました。
変数宣言
余計なものは提供しないのがGo言語の私のイメージなんですが、変数宣言は改めて見ると多彩ですね。
package main func main() { var a int var b int = 1 var c = 0 var ( d int e int = 1 f = 0 ) var a1,a2 int var b1,b2 int = 0,1 var c1,c2 = 0,1 a = b + c + d + e + f a1 = b1 + c1 a2 = b2 + c2 print("Hello World",a, a1,a2) }
package main func main() { a:= 1 b,c := 2,3 var d int = 4 print("answer=",a,b,c,d) }
そして、iotaの存在。これは他の言語で見たことがないですね。
package main import "fmt" func main() { const c1 string = "hoge" const ( c2 = 1 c3 = c1 ) fmt.Println(c1,c2,c3) const ( c4 = iota c5 = iota c6 ) const ( c7 = iota c8 = 0 c9 = iota c10 ) fmt.Println(c4,c5,c6) // 0 1 2 fmt.Println(c7,c8,c9,c10) // 0 0 2 3 }
ポインタ型
ポインタありましたか。
package main import "fmt" func main() { var p *int n:=10 p = &n fmt.Println(p) fmt.Println(*p) }
配列
配列の宣言は、CやC++ライクではないですね。
変数名、型名と宣言するから、まあ、自然ですかね。
package main import "fmt" func main() { var a[3] int b := [2]string{"hoge","fuga"} c := [...]int{1,2} d:=[3]int{1:1,2:10} fmt.Println(a[0]) fmt.Println(b[1]) fmt.Println(d[0],d[1],d[2]) fmt.Println(len(a)) fmt.Println(len(c)) }
マップ型
文字列などをキーに取ることのできる連装配列の宣言です。
package main import "fmt" func main() { m := map[string]int{"a":1,"b":2} m["b"] = 10 fmt.Println(m["a"],m["b"]) }
メソッド
型の中で、メソッドを宣言するのではなく、型とメソッドを関連付ける形式での宣言。
関連づけられる型はレシーバと呼ばれます。
package main import "fmt" type Calc struct { a,b int } type MyInt int func (p Calc) Add() int { return p.a + p.b } func (m MyInt) Add(n int) MyInt { return m + MyInt(m) } func main() { p:= Calc{3,2} var m MyInt = 1 fmt.Println(p.Add()) fmt.Println(m.Add(2)) }
ゴルーチン
Go言語の一番の魅力って非同期をスマートに書けることだと思います。
Node.jsは3タイプありますが、一番良いasync/awaitを使ったとしても、どうしてもasyncの伝播が激しくなってしまう。
C#もasync/awaitを使うことになりますが、まだNode.jsよりはマシですが同様です。
Javaに至っては標準で非同期が用意されていません。
ゴルーチン間ではチャネルを使って値のやり取りをします。
package main import "fmt" func main() { ch:= make(chan int) go send(ch) c:= <-ch fmt.Printf("receive value: %d\n",c) } func send(ch chan int) { fmt.Println("send value:1") ch<-1 }
この本については、もう少しゴルーチンについて触れて欲しかったですね。