環境
macOS Monterey
Apple M1 MAX
go 1.18.4

インストール

下記インストーラーをダウンロードするかmacならHomebrewでインストールできます。

Downloads – The Go Programming Language

今回はHomebrewでインストールします。

$ brew install go

インストールが完了したらgoコマンドが使えるか確認してみましょう。

$ go version
go version go1.18.4 darwin/arm64

プロジェクトディレクトリの作成

適当なディレクトリを作り移動します。

$ mkdir hello
$ cd hello

次にmain.goという名前でファイルを作成します。
Goの拡張子はgoで起点となるのがmain.goのmain関数になります。

$ touch main.go

文字列を表示するプログラム

最初に文字列を表示するだけの簡単なプログラムを作成してみましょう。
作成したmain.goを次のように編集します。

main.go

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello Go")
}

Go言語はソースファイルをコンパイルする必要があります。
次のコマンドでコンパイルしましょう。

$ go build

「hello」というファイルが生成されますのでこのファイルを実行します。

$ ./hello
Hello Go

直接実行することもできるみたいです。

$ go run main.go

変数

変数はvar 変数名 型名で宣言します。

var num int = 123
var text string = "テキスト"

変数宣言と代入を同時に行う場合は、varと型名を省略して書くことができます。

num := 123
text := "テキスト"

配列

配列は数固定の場合に使用します。

nums := [3]int{1, 2, 3}
fmt.Println(nums[0])

スライス

配列の数が変動する場合はスライスを使用します。

var nums []int
nums = append(nums, 1)
nums = append(nums, 2)
fmt.Println(nums[1])

マップ

key,valueのデータ構造を扱う場合はマップという機能を使います。

status := map[int]string{
	200: "OK",
	404: "Not Found",
}

status[500] = "Error"

fmt.Println(status[200])

if文

goは()が必要ないです。

num := 100

if num == 100 {
	fmt.Println("100です")
} else if num > 100 {
	fmt.Println("100より大きい")
} else {
	fmt.Println("それ以外")
}

for文

forも()が必要ないです。

for i := 0; i < 5; i++ {
	fmt.Println(i)
}

for文はその他にもいろいろなことができます。
例えば配列やスライスの展開。

langs := [3]string{"Go", "JavaScript", "PHP"}

for i, s := range langs {
	fmt.Println(i, s)
}

「i」にはインデックス、マップならキーが入りますが明示的に使用しないのであれば「_」を使います。

for _, s := range langs {
	fmt.Println(s)
}

無限ループ系もforを使います。

count := 0

for {
	count++
	println(count)

	if 5 < count {
		break
	}
}

関数

すでにmain関数を作っていますが、関数は「func」で定義します。

func calc(x, y int) int {
	return x + y
}

println(calc(5, 10))

returnする変数を型の部分に定義しておくこともできます。
複数値を返す場合はこのようにも書けます。

func calc(x, y int) (num int, isPlus bool) {
	num = x + y
	if num < 0 {
		isPlus = false
	}
	return
}

num, isPlus := calc(1, 3)

無名関数はこのようになります。

calc := func(x, y int) int {
	return x + y
}

構造体

いくつかのデータの塊は構造体で定義できます。

type User struct {
	Name string
	Age  int
	Mail string
}

user := User{
	Name: "山田 太郎",
	Age:  10,
	Mail: "yamada@example.com",
}

fmt.Println(user.Name)