見出し画像

プログラムを制御せよ!Defer!(Go言語)

本日は,Goのdeferについてです.

deferの意味は,「延期する.先延ばしにする.」と言った意味があります.

さて,Goのdeferとはどのようなものなのでしょうか?

ちなみに,本投稿もdeferしておりますw

説明用のコード

本日の説明用のコードはこちらです.

package main

import (
	"fmt"
)

func main() {
	defer1()
	defer2()
}

func defer1() {
	defer fmt.Println("World")
	fmt.Print("Hello")
	fmt.Print(",")
}

func defer2() { /* deferはスタックされる! */
	defer fmt.Println()
	for i := 0; i < 10; i++ {
		defer fmt.Print(" ", i+1)
	}
	fmt.Println("Count down start !")
}

本コードは,下記のサイトで実行できます.

Deferの先延ばし

まずこちらのコードを見てください.

func defer1() {
	defer fmt.Println("World")
	fmt.Print("Hello")
	fmt.Print(",")
}

このコードが実行されると,結果はこちらになります.

Hello,World

びっくりですね.「WorldHello,」になるのかと思いきや,ちゃんと「Hello,World」となっています.

これが,Deferです!
fmt.Println("World")の実行が先延ばしにされております!

deferで指定した関数は,その親関数(ここでは,defer1関数)の実行が終了する直前に呼び出されます!

Deferが複数だとどうなる?

さてさて,一つの関数の中で,複数回Deferするとどうなるのでしょうか?

func defer2() { /* deferはスタックされる! */
	defer fmt.Println()
	for i := 0; i < 10; i++ {
		defer fmt.Print(" ", i+1)
	}
	fmt.Println("Count down start !")
}

こちらの実行結果は,

Count down start !
10 9 8 7 6 5 4 3 2 1

このようにります!

deferに指定した関数はスタックされます!

スタックとは

スタックとは,LIFO(Last In First Out)とも呼ばれます.詳しくはこちらを参照してください.

上のサムネイル画像で簡単に説明すると,一つの「箱」に「値」をいれます(push).このとき,値は積みあがっていきます.(stack=積み重ねの意味)

ここで,「値」を「箱」から取り出す(pop)場合,「箱」の一番上から順に「値」が取り出されます.

これが,スタックです.

スタックを勉強するついでに「キュー(FIFO)」も勉強しましょう!
FIFOは「First In First Out」の略です.(ワールドカップではありませんw)

このようなアルゴリズムやアーキテクチャを学ぶことは,
 良いソフトウェア開発者になるための必須条件です!

Deferのメリット

ここから先は

904字
500円で,本マガジンのすべてを読むことができます.プログラム初心者でもGO言語を習得できるように丁寧な説明を心がけています.もちろん,購読できない方にも,Goの魅力を伝えていきます!

基本的にGoの公式サイトをわかり易く解説していきます.本マガジンは500円です.購入すれば,本マガジン内の全記事がストレスなく読めます!

期間限定 PayPay支払いすると抽選でお得に!

サポートお願いいたします.主に初心者から中級向けに,ソフトウェア開発に関する知識を提供していきます.