こんばんは!
ついにタイトルが「〜の話」でなくなりました笑
そんな深い意味は無いんですが、シリーズ物になりそうなので、カッコつけてみました。
今日は少し背景が長くなるんですが、最近会社で使うGo言語の勉強方法について悩んでたんです。
技術書を買ってもやり切れた試しが無いし、何か良い方法はないかと。
そしたら下記のような動画に出会いました。
内容はプログラミング言語の勉強方法です。
ノートと言っても紙に書くのではなく、公式のドキュメントを読みながらコピペして自分なりの解釈を書きながらまとめていくと言う物です。
良かったらみて見てくださいね。
で、すぐやりたがる私としては「これ、いいやん!!!!」となった訳です。
何せお金もかからないし、コードをノートに手書きって昔やったことあるんですけど、なんか時間がもったいない気がしていたので、、、。
そんなわけで今日はGo言語の公式ドキュメントである「A Tour of Go」をやりながら、自分なりの解釈も交えてまとめてみました。
A Tour of GOはこちらです。
結構コンテンツ的に長くなりそうなので、少しずつ攻略していきます。
また、自分用のメモなので深くは解説してないと思いますがご了承ください。
それでは本編の方どうぞ〜〜〜
A Tour of Go 攻略戦第一夜
記述方式について。
プログラムはmainパッケージから開始される。
Importで外部ライブラリを参照できる。
fmtはフォーマット、time は時間とか。
大文字で始まる名前は外部のパッケージからエクスポートされた物。
(Printlnとか)
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("Welcome to the playground!")
fmt.Println("The time is", time.Now())
}
//go run main.go 出力結果
Welcome to the playground!
The time is 2009-11-10 23:00:00 +0000 UTC m=+0.00000000
package main
import (
"fmt"
"math/rand" //package randを参照している。
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}
//go run main.go
My favorite number is 1
Functions(関数)
関数は0個以上の引数をとる。
変数は後ろに型名を書く。
package main
import "fmt"
func add(x int, y int) int {
// func add(x , y int)と省略しても良い。
return x + y
}
func main() {
fmt.Println(add(42, 13)) //fmtでPrintln関数を呼び出している。
}
//go run main.go
55
また、戻り値を変数に代入できる。
package main
import "fmt"
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
func main() {
fmt.Println(split(17))
}
//go run main.go
7 10
varは変数の宣言に使用する。
変数ごとに初期化子を与えられる。(型省略できる)
関数内ではvarの代わりに:=を使用できる。
定数の宣言constでは:=で省略できない。
package main
import "fmt"
func main() {
var i, j int = 1, 2
k := 3
c, python, java := true, false, "no!"
fmt.Println(i, j, k, c, python, java)
}
//go run main.go
1 2 3 true false no!
For文
(golangにwhile文は無い!)
package main
import "fmt"
func main() {
sum := 0 //sumを定義
for i := 0; i < 10; i++ {
sum += i
}
//iを0で定義し、i<10以下だったら{}内を実行し、実行後iに1を足す。
//以降はi<10の条件が満たされなくなるまで繰り返す。
//{}内はsumにiを足す。
//I := 0の初期化とi++の後処理ステートメントは記述任意。
//;も省略できる。
fmt.Println(sum)
}
//go run main.go
45 // 1+2+3+4+5+6+7+8+9
ループ条件を省略すると無限ループになる。
package main
func main() {
for {
}
}
//go run main.goで無限列車編が始まる。。。。
if文
(math.Sqrt()で引数の平方根を返す)
If文内で宣言された変数はif内でのみ有効(スコープの考え方)
package main
import (
"fmt"
"math"
)
func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}
func main() {
fmt.Println(sqrt(2), sqrt(-4))
}
//go run main.go
1.41421356…. 2i
もちろんelseもあります。
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
// can't use v here, though
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
//go run main.go Math.PowはAのB乗、つまり3の2乗、3の3乗
27 >= 20
9 20
(コードの補足: main の fmt.Println は、2つの pow が先に実行されてから実行されます)
結構ややこしくなってきた笑
この後に練習問題があったのですが、やたら鬼畜で時間がかかりそうなので次回以降に持っていきます!
それでは今日はこのへんで!
2020.12.27 ガオ
コメント