Open3

Go 言語の好きなところ

yuheitomiyuheitomi

個人的に気に入っている Go 言語の特徴についてのメモ。世間的に認知されていて評価の高いところもあれば、あまり聞かないけど個人的に好きなポイントなど、備忘録として。

yuheitomiyuheitomi

シンプルかつ汎用性の高い for

ループ構文が for で統一されていて、かつ for の使い方が多様なこと。

よくあるのは for 以外にも whileloop など用途によっていくつかのキーワードを使い分けるパターンだと思うが、Go の場合 for のみで複数のパターンに対応。Go 言語の simplicity に対するこだわりを端的に表す事例だと思うし、人によって好みは分かれそうだけど、Go 言語のシンプルさを保ちつつも実用性を担保した設計はとても好き。

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println(i)
    }

    for {
        fmt.Println("loop")
        break
    }

    nums := []int{1, 2, 3, 4}
    for _, v := range nums {
        fmt.Println(v)
    }
}

Go の特徴であるチャネルについても for + range で値を受け取れるので、通常のスライスから値を取り出すイメージでそのまま使える。

func main() {
    nums := make(chan int)

    go func() {
        defer close(nums)
        for i := 0; i < 5; i++ {
            nums <- i
        }
    }()

    for n := range nums {
        fmt.Println(n)
    }
}

色々なシチュエーションに対応しつつもシンプルさを保つのはセンスがいるところだと思うが、Go は絶妙なバランスだと思う。

yuheitomiyuheitomi

自動フォーマットによる構造体のアラインメント

フォーマットが gofmt で一意に決まるというのはもちろんのこと、構造体などの定義の際に型宣言した部分がアラインされること。単純に見やすいというだけの理由ながら、これも含めて勝手に問答無用でフォーマットされるというのが良い。

type Person struct {
    FirstName  string `json:"first_name"`
    FamilyName string `json:"family_name"`
    Age        int    `json:"age,omitempty"`
}
var (
    patternA   *regexp.Regexp
    patternAA  *regexp.Regexp
    patternAAA *regexp.Regexp
)