hene

hene.dev

A Tour of Go をやってみた

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

感想

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

参考

関連記事