本日は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) }
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) }