0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

サーバサイド初心者がGoの基本構文を個人的に理解しようとした話

Last updated at Posted at 2019-10-08

A Tour of Goも中盤に差し掛かり基本構文の章に差し掛かりました。

For文

  • 普通のfor文
func main() {
	sum := 0
	for i := 0; i < 10; i++ {
		sum += i
	}
	fmt.Println(sum)
}
  • while文的な書き方
func main() {
	sum := 1
	for ; sum < 1000; {
		sum += sum
	}
	fmt.Println(sum)
}

ということはもちろんセミコロンを排除できる

func main(){
       sum := 1
       for sum < 1000 {
             sum += sum
       }
       fmt.Println(sum)
}

スラっとした綺麗なコード、if文まだ触ってないからあれやけど、for bool もできるのでは?

  • 無限ループ
func main(){
       for {
       }
}

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))
}
  • 前にステートメントを付けたとき
func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
	    fmt.Println(v)
		return v
	}
	return lim
}

このコードを理解するのに時間がかかったくらいにはプログラミング初心者なのかもしれない()
最初の ` v := math.Pow(x,n); でステートメントを追加してvにxをn乗したものを代入して、
if v < limならこのメソッドは戻り値にvを返す。違うならlimをっていう形ですねー。

マジでちょっと悩んだのが悔しい。

  • else文
 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)
	}
	return lim
}

elseを入れる場合もこのケースでのvなどのif文で生成した変数は、スコープ内として扱える。

ほう。。。なるほど。。。

割と簡単なケースが多くて割と安心したっていうのが正直なところっていう感じ。

Switch文


func main() {
	fmt.Println("When's Saturday?")
	today := time.Now().Weekday()
	fmt.Println(today)
	switch time.Saturday {
	case today + 0:
		fmt.Println("Today.")
	case today + 1:
		fmt.Println("Tomorrow.")
	case today + 2:
		fmt.Println("In two days.")
	default:
		fmt.Println("Too far away.")
	}
}

一般的な記法と同じでif else構文を短縮したもの。便利でいいなーってサンプルコードを読んでて思ったのは、time.Now().Weekday()って呼ぶだけで、当日の曜日がわかるのは正直激アツ。

  • switch trueも可
func main() {
	t := time.Now()
	switch {
	case t.Hour() < 12:
		fmt.Println("Good morning!")
	case t.Hour() < 17:
		fmt.Println("Good afternoon.")
	default:
		fmt.Println("Good evening.")
	}
}

なるほど。簡単

defer

これやばい、意味わかんね。やばい。

func main() {
	x := 1
	defer fmt.Println(x)
	x = 2
	fmt.Println("hello") 
}

//出力結果
//hello
//1

deferはその呼び出し元のメソッドがリターンすると呼び出されるもの。参照はトップダウンで終わるが、呼び出しが実行後にくるって、なるほど。参照が先にされるのが少し自分的にははてながつくが、まぁそういうもんだろうと一旦流す。

  • Last-in-First-Out

func main() {
	fmt.Println("counting")

	for i := 0; i < 10; i++ {
		defer fmt.Println(i)
	}

	fmt.Println("done")
}

この場合はLiFOの原理によって9から逆順になる。最後に入れたものが最初に出てきて、最初に準備してた人が最後に出てくる。逆リハ。的な。その。的な?

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?