たなしょのメモ

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

Goの学習メモ10

新しく

また新しく初心者向けの教材を始めた。
今回はビデオ教材を使ってGoを学習していくことにする。
頑張ろう。

init

init関数を書くとmainより先に実行してくれるのか。
初期設定などで使えるかもしれない。

func init() {
    fmt.Println("Init!")
}

packageで遊ぶ

os/userというパッケージがあるのか。
ユーザ情報を見れるらしい。

import "os/user"

fmt.Println(user.Current())

timeはよく使ってたけど、time.Now()で現在時刻を表示する。

import "time"

fmt.Println(user.Current())

変数

varはグローバル変数にもなるらしい。 short variableはファンクション内のみできる。

package main

import "fmt"

var (
    i    int     = 2
    f64  float64 = 2.3
    s    string  = "test"
    t, f bool    = true, false
)

func foo() {
    xi := 1
    var xf32 float32 = 23.3
    xs := "ttt"
    xt, xf := true, false
    fmt.Println(xi, xf32, xs, xt, xf)
    fmt.Printf("%T\n", xf32)
    fmt.Printf("%T\n", xi)
}

func main() {
    fmt.Println(i, f64, s, t, f)
    foo()
}

const

constは宣言時は型を固定しないらしい。
だからオーバーフローになる前にその値を引けばオーバーフローにはならない。

package main

import "fmt"

const Pi = 3.14

const (
    Username = "test_user"
    Password = "test_pass"
)

const big = 9223372036854775807 + 1

func main() {
    fmt.Println(Pi, Username, Password)
    fmt.Println(big - 1)
}

文字列

シングルクオーテーションがかなり強力なんだとわかった。

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println("Hello world")
    fmt.Println("Hello " + "World")
    fmt.Println(string("Hello World"[0]))
    var s string = "Hello World"

    s = strings.Replace(s, "H", "X", 1)
    fmt.Println(s)
    fmt.Println(strings.Contains(s, "world"))

    fmt.Println(`ts
                      ts
ts`)

    fmt.Println("\"")
    fmt.Println(`"`)
}

シングルクオーテーションでくくると下記のようなスペースの状態で表示される。

fmt.Println(`ts
                      ts
ts`)

Atoi

goにもatoiがあったんだ。
文字列を数値に変換できるらしい。 strconvライブラリから呼び出す。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var x int = 1
    xx := float64(x)
    fmt.Printf("%T %v %f\n", xx, xx, xx)

    var y float64 = 1.2
    yy := int(y)
    fmt.Printf("%T %v %d\n", yy, yy, yy)

    var s string = "14"
    i, _ := strconv.Atoi(s)
    fmt.Printf("%T %v\n", i, i)

    h := "Hello World"
    fmt.Println(string(h[0]))
}

エラーメッセージを出力點せたくない場合は_をつかう

i, _ := strconv.Atoi(s)

slice

今まで少ししか勉強できてなかったがある程度理解できたかも。

package main

import "fmt"

func main() {
    n := []int{1, 2, 3, 4, 5, 6}
    fmt.Println(n)
    fmt.Println(n[2])
    fmt.Println(n[2:4])
    fmt.Println(n[:2])
    fmt.Println(n[2:])
    fmt.Println(n[:])

    n[2] = 100
    fmt.Println(n)

    var board = [][]int{
        []int{0, 1, 2},
        []int{3, 4, 5},
        []int{6, 7, 8},
    }
    fmt.Println(board)

    n = append(n, 100, 200, 300, 400)
    fmt.Println(n)
}

二重配列を表すにはこんなふうに書くのか。

var board = [][]int{
    []int{0, 1, 2},
    []int{3, 4, 5},
    []int{6, 7, 8},
}

スライスの宣言の仕方にも色々あるみたい。
コメントアウトされているdははじめに[0, 0, 0, 0, 0]を作成してからその後ろに0~4を代入する。
d := make([]int, 0, 5)はメモリが5の配列を確保するだけなので、0~4をいれて[0, 1, 2, 3, 4]を代入できる。

//d := make([]int, 5)
d := make([]int, 0, 5)
for i := 0; i < 5; i++ {
    d = append(d, i)
    fmt.Println(d)
}
fmt.Println(d)

map

特に新しく学んだものはないんだけど、空のmapはnilになる。

var m3 map[string]int
if m3 == nil {
    fmt.Println("Nil")
}

byte

byteで記載した数字をasciiの文字コード文字にしたりその逆もできるのか。
ネットワークとかに使うらしい。

package main

import "fmt"

func main() {
    b := []byte{82, 83}
    fmt.Println(b)
    fmt.Println(string(b))

    c := []byte("PR")
    fmt.Println(c)
    fmt.Println(string(c))
}

function

返り値の値を先に記載しておけばreturnのあとに変数を書かなくてもいい。
今回の場合先にresult intを記載してるのでreturnは空でいい。

func cal(price, item int) (result int) {
    result = price * item
    return
}

関数の中に関数を書く場合は前者は一度変数に読み込んで、変数を宣言しているが、後者のように関数宣言にのあとに()で引数を代入して出力させることも可能。

f := func(x int) {
    fmt.Println("inner func", x)
}
f(1)

func(x int) {
    fmt.Println("inner func", x)
}(1)

クロージャ

はじめにcircleAreaのpiに値を代入する。
その後c1(もしくはc2)にのradiusに値を代入することでcicleAreaの返り値を計算する。  

package main

import "fmt"

func cicleArea(pi float64) func(radius float64) float64 {
    return func(radius float64) float64 {
        return pi * radius * radius
    }
}

func main() {
    c1 := cicleArea(3.14)
    fmt.Println(c1(2))

    c2 := cicleArea(3)
    fmt.Println(c2(2))
}