【第七回Go言語学習備忘録】deferを利用した遅延処理に挑戦!

2月 12, 2022

どもです。gucciとドラえもんコラボが死ぬほど気になるもののそんな財力はない、saisaiです。


今回は、コードの遅延実行を可能とする"defer"について学習しましたので備忘録としてまとめていきたいと思います。

遅延実行をやってみる

遅延実行とは、読んで字の如く特定のコードを後から実行することです。実際にコードにしてみた方が分かりやすいのでまずは簡単な例を作成してみました。

package main

import "fmt"

func main() {
	defer fmt.Println("end")
	fmt.Println("start")
}
//結果
//start
//end

“end"を出力するコードを先に書きましたが、実際に実行すると英単語通り"start -> end"と出力されます。つまり、"defer"で指定したコードが遅れて実行されているということがわかります。

どのように使用するのか

では、具体的にどのような場面で用いられるのでしょうか。シリコンバレーエンジニアの酒井潤さんが提供いらっしゃるudemyのコース「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」を参考にコード作成させていただきました。Go学習に非常に有用な教材ですので、是非覗いてみてください。コードは以下の通りです。

package main

import (
	"fmt"
	"log"
	"os"
)

func main() {
	file, err := os.Open("./sample.txt")
	defer file.Close()
	if err != nil {
		log.Fatalln("Error", err)
	}
	data := make([]byte, 50)
	file.Read(data)
	fmt.Println(string(data))
}

さて、急に難易度が上がった気がしますがしっかり噛み砕いて理解していこうと思います。
ちなみ上記コードの出力結果は以下の通りです。

saisai % go run main.go

This is sample text.
This is sample text.
This is

予め用意しておいたsample.txtの中身の内、50バイトを表示しています。

file, err := os.Open("./sample.txt")
//処理
file.Close()

まず特定のファイルを開く"os.Open"を使用します。ここで注意しないといけないのは、一度Openしたファイルは使用しなくなったタイミングでcloseしてやる必要があるということです。なので本来であれば上記のように、最後にファイルをcloseしてやる必要があります。

しかし、deferでcloseを遅延実行するように予めコードを書いておけばcloseを意識せずにコードを書き続けることができるので、非常に便利です。

file, err := os.Open("./sample.txt")
	defer file.Close() //os.Openしたら合わせて定義しておく!
//処理

ついでに解説すると下記の部分はエラー処理を実行しています。

if err != nil {
		log.Fatalln("Error", err)
	}

もし"error"が"nil(なし)"ではない(!=)なら、エラーログを出力して終了するという処理になります。例えば、"sample.txt"を削除してこのコードを実行した場合は以下のような出力結果になります。

saisai % go run main.go

2021/01/20 23:23:42 Error open ./sample.txt: no such file or directory
exit status 1

“faitalln"は"print"系と同じく出力系の関数ですが、faitallnの場合は値を出力した時点で関数内の処理自体を終了します。


エラーログ処理などでよく見かける形式となりますので、合わせて押さえておきたいですね。

ひとこと

今回はdeferを使用した遅延実行についてまとめてみました。ついでに標準パッケージであるosやlogについても触れることもできたのでかなり勉強になりました!


コード見易さや処理の順番など、defer使用の可否を意識するとコードの質も格段に上がりそうです。どんどん使ってマスターしていきたいと思います!


ここまで読んでいただきありがとうございます!


-saisai-


↓本日のオススメ

Golang

Posted by CY