Goは2007年ごろからGoogleが中心となって設計が始まり,2009年にオープンソースとして公開された.
Goの開発目的は以下のように記載されている.
The goals of the Go project were to eliminate the slowness and clumsiness of software development at Google, and thereby to make the process more productive and scalable. The language was designed by and for people who write—and read and debug and maintain—large software systems. (https://go.dev/talks/2012/splash.article)
開発者らはこの目的に沿い,以下の特徴を持つものを構想していた.
これらをもとに開発されたのがGoである.
Goでは複数の方を抽象化して使う際に, インタフェース という概念を利用する.インタフェースは任意の型が実装していないといけないメソッド群を定義する.
以下の例では任意の型が Howler
として認識されるには, string
型を返す Howl
メソッドを実装している必要があることを明示している.
gotype Howler interface {
Howl() string
}
type Dog struct {}
func (d Dog) Howl() string { return "bowwow" }
type Cat struct {}
func (c Cat) Howl() string { return "meow" }
func PrintHowling(h Howler) {
fmt.Println(h.Howl())
}
PrintHowling(Dog{}) // bowwow
PrintHowling(Cat{}) // meow
Dog
型も Cat
型も暗黙的に Howler
インタフェースを満たしているとみなされている.これはダックタイピングまたは構造的型付けと呼ばれる型の分類の方式である.
Goにおける並列処理は goroutine
という単位で管理されており,言語仕様に最初から並列処理が組み込まれている. goroutine
はそれぞれが1つのスレッド・実行単位となっており,I/Oが発生したタイミングなどでそれぞれの gorouitne
が協調して複数個実行される.
使い方は,goキーワードの後に関数やメソッドを指定するだけ.これだけで goroutine
が作成され,並列処理が可能となる.
gogo Process()
goroutine
に関しては,今後もう少し深堀した記事を書くかもしれない…
Go 1.10 までは,Goコンパイラが依存関係の置き場所と認識できる場所にファイル軍を展開しておくことで,外部ライブラリを参照していた.Go 1.11から段階的に,コンパイル時の冪等性を高めるべくGoモジュールという概念が導入,開発され続け,Go 1.16 でデフォルトで有効化された.
Goモジュールは go.mod
と go.sum
という2つのファイルで管理される.
他言語と比べても,Goのモジュールサポートは非常に扱いやすい.
go fmt
というコードフォーマッタが標準実装されている.以下のように実行するだけで,ファイルの中身を自動的に書き換えて標準的なフォーマットに修正してくれる.
shellgo fmt -w foo.go
GoでコンパイルされたコードはGoらんたいむを含めた,ワンバイナリとしてコンパイルされる.つまり,出来上がったコマンドは基本的にそのファイルを1つインストールすればそれだけで動作する.
以下にある通りにやればインストールできるはず.
ディレクトリ用意
shell$ cd ~
$ mkdir hello
$ cd hello
go.mod
ファイルの作成.
shell$ go mod init example/hello
go: creating new go.mod: module example/hello
$ cat go.mod
module example/hello
go 1.19
hello.go
ファイルの作成・編集.
shell$ vi hello.go
hello.go
を以下のように編集.
gopackage main
import "fmt"
func main() {
fmt.Println("Hello World")
}
実行.
shell$ go run hello.go
Hello World
コマンドラインツールから,DockerやKubernetesのような巨大なシステムまで多様な場所で使われている.wasm(Web Assembly)経由でブラウザで実行することも可能.
また, goroutine
を使うことで容易に並列処理を書くことができ,高負荷にも耐えうるため,マイクロサービスでよく用いられる.
以下でGoの採用企業を見ることができる.非常に多くの企業に採用されていることが分かる.