より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

読書感想「プログラミング経験者がGo言語を本格的に勉強する前に読むための本」

Go言語にざっと触れるには良い本です。

プログラミング経験者が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
}

ポインタ型

ポインタありましたか。

f:id:rimever:20210530213500p:plain

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
}

この本については、もう少しゴルーチンについて触れて欲しかったですね。