新しく
また新しく初心者向けの教材を始めた。
今回はビデオ教材を使って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)) }