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)
クロージャ
よくわかってない。
感想
難しくて理解できないところが多かったので、もう少しいろいろ触ってみる。 最後までやりたい。