たなしょのメモ

日々勉強していることをつらつらと

Go学習メモ4

本日はGo

アロマディフューザーを買った。
とてもいい匂いがするし、素晴らしい買い物だった。

slice型を更に詳しく

可変長配列のように値をもたせることもできるらしい。

s := []struct {
        i int
        b bool
    }{
        {12, true},
        {34, false},
        {23, true},
    }
    fmt.Println(s)

配列にスライスで求めた値を更に代入した配列をスライスで出力してるのか。ややこしい。

package main

import "fmt"

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

    s = s[:0]
    printSlice(s)

    s = s[:5]
    printSlice(s)

    s = s[2:]
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

空集合nilで判別するらしい。

package main

import "fmt"

func main() {
    var s []int
    fmt.Println(s, len(s), cap(s))
    if s == nil {
        fmt.Println("nil!")
    }
}

動的配列の確保はmakeを使うのか。
なれるまで時掛かりそうだな。

a := make([]int, 5)
printSlice("a", a)

b := make([]int, 0, 5)
printSlice("b", b)

文字列配列を[]なしで列挙するにはstrings.Joinを使うみたい。

package main

import (
    "fmt"
    "strings"
)

func main() {
    board := [][]string{
        []string{"_", "_", "_"},
        []string{"_", "_", "_"},
        []string{"_", "_", "_"},
    }

    board[0][0] = "O"
    board[1][1] = "O"
    board[2][2] = "O"

    for i := 0; i < len(board); i++ {
        fmt.Printf("%s\n", strings.Join(board[i], " "))
    }
}

配列に文字を追加したい場合はappendを使う。
これもpythonと同じ。

var s []int
printSlice(s)

s = append(s, 0)
printSlice(s)

s = append(s, 1)
printSlice(s)

s = append(s, 2, 3, 4)
printSlice(s)

Range

Goのrangeはindexの他に要素の中身も返すのか。
はじめは使うのに手間取りそうだ。

package main

import "fmt"

var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {
    for i, v := range pow {
        fmt.Printf("s**%d = %d\n", i, v)
    }
}

上記のコードで言うとiがindexで、vがpow[i]の値ってこと。

このコードはrangeが回るごとに左にビットシフトさせているのか。

pow := make([]int, 10)
for i := range pow {
    pow[i] = 1 << uint(i)
}