Open3
Go 言語の好きなところ
個人的に気に入っている Go 言語の特徴についてのメモ。世間的に認知されていて評価の高いところもあれば、あまり聞かないけど個人的に好きなポイントなど、備忘録として。
for
シンプルかつ汎用性の高い ループ構文が for で統一されていて、かつ for の使い方が多様なこと。
よくあるのは for
以外にも while
や loop
など用途によっていくつかのキーワードを使い分けるパターンだと思うが、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 は絶妙なバランスだと思う。
自動フォーマットによる構造体のアラインメント
フォーマットが 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
)