Dyuichi Blog

Go言語(golang)について

Go言語(golang)とは

歴史

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 の特徴
構造的型付け

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 モジュール

Go 1.10 までは,Goコンパイラが依存関係の置き場所と認識できる場所にファイル軍を展開しておくことで,外部ライブラリを参照していた.Go 1.11から段階的に,コンパイル時の冪等性を高めるべくGoモジュールという概念が導入,開発され続け,Go 1.16 でデフォルトで有効化された.

Goモジュールは go.modgo.sum という2つのファイルで管理される.

他言語と比べても,Goのモジュールサポートは非常に扱いやすい.

コードフォーマッタ

go fmt というコードフォーマッタが標準実装されている.以下のように実行するだけで,ファイルの中身を自動的に書き換えて標準的なフォーマットに修正してくれる.

shellgo fmt -w foo.go

ワンバイナリ

GoでコンパイルされたコードはGoらんたいむを含めた,ワンバイナリとしてコンパイルされる.つまり,出来上がったコマンドは基本的にそのファイルを1つインストールすればそれだけで動作する.

Getting Started

Go のインストール

以下にある通りにやればインストールできるはず.

Hello World

ディレクトリ用意

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

Go の利用用途

コマンドラインツールから,DockerやKubernetesのような巨大なシステムまで多様な場所で使われている.wasm(Web Assembly)経由でブラウザで実行することも可能.

また, goroutine を使うことで容易に並列処理を書くことができ,高負荷にも耐えうるため,マイクロサービスでよく用いられる.

採用企業

以下でGoの採用企業を見ることができる.非常に多くの企業に採用されていることが分かる.

参考文献