A Tour of Go をやってみた
A Tour of Go をやってみた
Go言語 を触ってみました。
A Tour of Go を進めました。
進捗
- [x] Welcome! - A Tour of Go
 - [x] Packages, variables, and functions. - A Tour of Go
 - [x] Flow control statements: for, if, else, switch and defer - A Tour of Go
 - [x] More types: structs, slices, and maps. - A Tour of Go
 - [ ] Methods and interfaces - A Tour of Go
 - [ ] Concurrency - 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 でやりました。
メモ
下記をやってみてのメモ。
- Welcome! - A Tour of Go
 - Packages, variables, and functions. - A Tour of Go
 - Flow control statements: for, if, else, switch and defer - A Tour of Go
 
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: 型 T の n 個の配列。
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)
クロージャ
よくわかってない。
感想
難しくて理解できないところが多かったので、もう少しいろいろ触ってみる。 最後までやりたい。
