環境
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)