Go言語とは


概要

Go言語はGoogleが開発したプログラミング言語です。
通常のアプリから、Webやモバイル向けの開発に使用されており、
Yahooやeureka、AWAなどの会社で使用されています。
また、オープンソースで作られておりソースは全て公開されているので
必要であれば自由に機能を追加、拡張できます。

構文(文法)

Go言語はC言語を基本としていますが、独自のルールがあります。

セミコロン省略可

Go言語ではソースコード上の改行コード「0x0A」を命令の文末として扱っているので
命令文の最後に必要だった「;(セミコロン)」の省略が可能です。

var value int
value = 100

厳密な型チェック

Go言語では代入などで厳密な型チェックが行われています。
例えば以下のコードはC言語などでは暗黙的なキャストが行われますが
Go言語ではエラーとなります。
var val01 int8  // 8ビット整数
var val02 int32 // 32ビット整数

val01 = 20
val02 = val01 // 型違いによるエラー


Goでは型が異なる場合は必ず明示的なキャストをする必要があります。
var val01 int8  // 8ビット整数
var val02 int32 // 32ビット整数

val01 = 20
val02 = int32(val01) // int32にint8をキャスト

未使用変数、パッケージの扱い

宣言しても使っていない変数やパッケージはエラーとして扱われます。

func main() {
	var dummy int // error

	fmt.Println("Hello World")
}

上のコードでは「not used」というエラーになります。
これによって使用、未使用の判別がコンパイラによって行われるので、
必要なコードだけでプログラムを実行できるようになります。

構文の削減

C言語や他の言語であるよう構文が用意されていません。
その分だけ覚える必要のある構文の数が減っています。

Goにない構文
  while構文  
  三項演算子  
  継承  

()の省略可

ifやforの構文で必要だった「()」も省略可能です。

if a == b {

}

for i := 0; i < 10; i++ {

}

書式の強制

Go言語では「{」の位置がifやforのすぐ後ろに記述するようにされており、
それ以外の位置に書くとエラーになります。

// 問題のない位置
if a == b {
	
}

// 問題のある位置
if a == b
{
	
}

「{」の位置はコーディング規約に入ることもありましたが、
Go言語では位置が決まっているので規約に書く必要がなくなります。

複数の値を返す

関数の戻り値で複数の値を返すことができます。
これによって、多言語では引数を使用して複数の値の結果を取得していたことを
戻り値として返すことができるようになりました。

func FindValue(array []int, find_value int) (is_find bool, find_id int) {
	find_id = -1
	is_find = false

	for i := 0; i < len(array); i++ {
		if find_value == array[i] {
			// 見つかったことと、idを設定する
			is_find = true
			find_id = i
			return
		}
	}

	return
}

func main() {
	var score []int = []int{
		10,
		4,
		5,
		7,
	}

	find_value := 2
	is_find, id := FindValue(score, find_value)

	if is_find == true {
		fmt.Println(id, "番目に", find_value, "がありました")
	} else {
		fmt.Println("見つかりませんでした")
	}

}

命名による公開制限

Go言語では関数名、構造体名などの命名は機能を説明するだけではなく
公開制限の機能も付与されています。
名前の先頭の文字によって制限の有無が設定され、「大文字は他パッケージに公開」
「小文字は他パッケージに非公開」となっています。
※同じパッケージ内なら小文字で使用可能です。
func Function() {
	fmt.Println("公開設定した関数")
}

func function() {
	fmt.Println("非公開設定した関数")
}

func main() {
	Function()
	function()
}

上のコードでは「Function」が公開設定で「function」が非公開設定になります。

平行処理

Go言語は並行処理の機能を言語に組み込んでいるので、
簡単に並行処理を書くことができます。
この並行処理を「ゴルーチン(goroutine)」と呼びます。

// ゴルーチン関数
func RunGoRoutine() {
	time.Sleep(2 * time.Millisecond)

	fmt.Println("Goルーチン実行")
}

func main() {
	// ゴルーチン実行
	go RunGoRoutine()

	fmt.Println("main実行")

	time.Sleep(5 * time.Millisecond)
}


上のコードを実行すると以下の結果になります。
// 結果
main実行
Goルーチン

ガベージコレクション

Go言語ではメモリの管理の機能としてガベージコレクションが実装されているので
newで動的に確保した変数に対してdeleteなどの関数を呼ぶ必要はありませんが
参照カウンタを減らす必要があるので不要になった変数には
きちんとnilを代入するようにします。

// intの動的生成関数
func CreateInt() *int {
	return new(int)
}

// 値変更関数
func ChangeValue(pval *int, value int) {
	*pval = value
}

func main() {
	var p *int = CreateInt()

	ChangeValue(p, 100)

	fmt.Println("アドレス:", p)
	fmt.Println("値:", *p)

	p = nil
}

コンパイル

Go言語では機械語にコンパイルして実行ファイルを作成するので
プログラムのインタプリタ形式の言語に比べて高速に動作します。
ただ、実行ファイルは特定のプラットフォームに対して作成されるので、
Javaのように作成した実行ファイルをそのまま別プラットフォームで
使用することはできません。
その代わり、様々な環境で動作する実行ファイルを作成する
クロスコンパイルの環境が充実しています。