Open3

Go言語講習会

naokinaoki

第1回 実行環境を整えよう

変数を定義するだけして、使用してなかった場合
コンパイルする時に、エラー吐くらしい。(おもろ

var i int = 10
fmt.Println("i is", i)
fmt.Printf("i type is %T, %v \n", i, i)

これで出力結果が、

i is 10
i type is int, 10

%v: 型を教えてくれる?

naokinaoki

第2回 シャドーイングと配列

Goでは、最初の文字が小文字ではなく大文字ではじまってるものは
公開されているパッケージであるということ。

短縮変数宣言

// 型推論を利用して、右辺から変数の型を自動的に決定している
ii := 123 // int型
fmt.Printf("ii type is %T, %v \n", ii, ii)

ff := 3.14 // float64型
fmt.Printf("ff type is %T, %v \n", ff, ff)

ss := "str" // string型
fmt.Printf("ss type is %T, %v \n", ss, ss)

変数を宣言する時に、右辺に値があるなら
短縮変数宣言を使うことが多いっぽい。

Goは、ポインタを使っていくっぽい。
よく分からなくなったらポインタを見ると良いか。

配列とスライス

// 配列
// 長さを3から変えることが出来ない。
x := [3]int{1,2,3}
fmt.Println(x)
fmt.Printf("x type is %T \n", x)

// スライス
// 長さを3から変えることが出来ない。
y := []int{1,2,3}
fmt.Println(y)
fmt.Printf("y type is %T \n", y)

出力結果がこれ。配列だと、配列数を変えることが出来ない

[1 2 3]
x type is [3]int 
[1 2 3]
y type is []int 

配列よりスライスの方がよく使うっぽい

こういうスライスもある

z := make([]int, 0)
fmt.Println(z)

[]こうなる

z := make([]int, 5)
fmt.Println(z)

[0,0,0,0,0]初期値が5個

naokinaoki

第3回 配列周りの回

配列の長さ取得 len()

array := make([]int, 0)
array = append(array, 1, 2, 3)
fmt.Println(len(array)) // 3

lengthの略で、配列の長さを取得できる

設定してる、配列の最大数を取得 cap()

array := make([]int, 0, 10)
fmt.Println(cap(array)) // 10

capacityの略で、配列に格納できる最大サイズを取得できる

配列のコピー copy()

copy(array1, array2)

copyメソッドで配列のコピーができるらしいけど、あんまり使わないらしい

Goはブロックスコープ

func main() {
	// 単純な代入だと「ポインターが一緒」になる
	{
		s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
		s2 := s
		fmt.Printf("%p, %p \n", s, s2)
		s[0] = 11
		fmt.Println(s2) // [11, 2, 3, 4, 5, 6, 7, 8, 9, 10]
	}
	{
		s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
		// [2:5] 2から5
		// [2:] 2から最後まで
		// [:5] 最初から5まで
		s2 := s[2:5]
		fmt.Printf("%p, %p \n", s, s2)
		fmt.Println(len(s), len(s2), s2) // [11, 2, 3, 4, 5, 6, 7, 8, 9, 10]
	}
}

ブロックスコープなので、この2つのブロックではポインタが違うけれど、
ブロック内では、ポインタは同じ

データ構造の作成 map()

{
    m := map[float64]bool{
        3.14: true,
        1.414: false,
    }
    fmt.Println(m)
}

型さえ合っていれば、どんな値入れてもおけ?