# A Tour of Go をやってみた

Go言語 を触ってみました。

A Tour of Go を進めました。

# 進捗

# 環境構築

# Go のインストール

$ brew install go

# バージョン確認

$ go version
go version go1.11.5 darwin/amd64

# Go Tour の実行

$ go tool tour
go tool: no such tool "tour"

だめだったので、

$ go get github.com/atotto/go-tour-jp/gotour
$ gotour
zsh: command not found: gotour

上手くいかなかったので、web でやりました。


# メモ

下記をやってみてのメモ。

# Packages, variables, and functions.

# 変数名の後ろに型名を書く

x int

x int, y int

x, y int

# var ステートメント

変数を宣言する。

var x, y, z bool

# initializer(初期化子)

var 宣言では、変数に初期化子を与えられる。

var x, y, z int = 2, 4, 8

# 暗黙的な型宣言

関数の中では、var の代わりに := を使って、暗黙的な型宣言ができる。

package main

import "fmt"

func main() {
  var x int = 1
  y := 2
  fmt.Println(x, y)
}

# 型変換

略。

# const(定数)

文字、文字列、boolean、数値で使える。

const test = true

# Big = 1 << 100

ここ、わかってない。

Big = 1 << 100

Numeric Constants - A Tour of Go

# Flow control statements: for, if, else, switch and defer

# for

略。

# while

Go では、for だけを使う。

# 無限ループ

package main

func main() {
  for {}`
}

# if

略。

# switch

break が自動的に提供される。 true になったら、それ以降の case は実行されない。

# defer

遅延させる。 defer ステートメントは、すぐに評価されるが、 呼び出し元の関数の終わりもしくは、return の後に実行される。

package main

import "fmt"

func main() {
	defer fmt.Println("defer")

	fmt.Println("test")
}

defer が複数ある場合は、LIFO(last-infirst-out) の順番で実行される。

package main

import "fmt"

func main() {
	fmt.Println("最初")

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

	fmt.Println("最後")
}

# More types: structs, slices, and maps.

# ポインタ

よくわかってない。

# Structs(構造体)

構造体 = field の集まり

package main

import "fmt"

type Sample struct {
	X string
	Y string
}

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

# struct のフィールドに . を用いてアクセスする

package main

import "fmt"

type Sample struct {
	X, Y string
}

func main() {
	v := Sample{"Hello", "Go"}
	v.X = "A Tour of"
	fmt.Println(v.X, v.Y)
}

# 配列

[n]T: 型 Tn 個の配列。

var a [100]int

# スライス

package main

import "fmt"

func main() {
	primes := [5]int{1, 2, 3, 4, 5}

	var s []int = primes[2:4]
	fmt.Println(s)
}

# 結果

[3 4]

# スライスの要素を変更すると、元の配列の対応する要素も変更


package main

import "fmt"

func main() {
	num := [5]int{1, 2, 3, 4, 5}
	fmt.Println(num)

	x := num[1:3]
	y := num[2:5]
	num[3] = 100

	fmt.Println(x)
	fmt.Println(y)
	fmt.Println(num)
}

# 結果

[1 2 3 4 5]
[2 3]
[3 100 5]
[1 2 3 100 5]

# 配列リテラル

[3]int{1, 2, 3}

[]int{1, 2, 3}

# スライス

var x [5]int

# 以下のスライス式は等価

x[0:5]
x[:5]
x[0:]
x[:]

# スライスの長さと容量

  • 長さ(length): len(s)
  • 容量(capacity): cap(s)

で、得られる。

よくわかってない。

# スライスのゼロ値は nil

略。

# make 関数

よくわかってない。

# append

スライスへ新しい要素を追加する。

# range

for ループで利用する。 スライスやマップの反復処理で使う。

略。

# _

インデックスや値は、 _(アンダーバー)へ代入すると捨てられる。

# map

キーと値を関連付ける。

package main

import "fmt"

type Sample struct {
	X, Y string
}

var m map[string]Sample

func main() {
	m = make(map[string]Sample)
	m["test"] = Sample{
		"テスト", "です。",
	}
	fmt.Println(m)
	fmt.Println(m["test"])
}

# 結果

map[test:{テスト です。}]
{テスト です。}

# map m の操作

# 要素の挿入・更新

m[key] = test

# 要素の取得

test = m[key]

# 要素の削除

delete(m, test)

# クロージャ

よくわかってない。

クロージャ - Wikipedia

# 感想

難しくて理解できないところが多かったので、もう少しいろいろ触ってみる。 最後までやりたい。

# 参考