1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Go】deferを理解しよう!〜初学者向けガイド〜

Last updated at Posted at 2024-08-23

はじめに

本記事では、Go言語のdeferについて、基本的な特徴を3点紹介します!

deferの特徴

1. 関数の実行を遅延させる

deferは、Goのキーワードの一つで、関数の実行を遅延させるために使用されます。具体的には呼び出し元の関数が終了する直前に、指定した関数を実行することができます。これによって、リソースの解放や後処理を簡潔に行うことができます!

例えば、以下のソースコードを見てください:

package main

import (
	"fmt"
)

func main() {
    fmt.Println("A")
    defer fmt.Println("B")
    fmt.Println("C")
}

このコードの実行結果は次のようになります:

A
C
B

deferを使った行は、関数の終わりに実行されるため、Bが最後に出力されます。

2. deferの関数の実行順序はLIFO(後入れ先出し)

複数のdeferを使うとどうなるでしょうか?次のソースコードを見てください:

package main

import (
	"fmt"
)

func main() {
    defer fmt.Println("0")
    defer fmt.Println("1")
    defer fmt.Println("2")
    fmt.Println("Main")
}

このコードの実行結果は次のようになります:

Main
2
1
0

複数のdeferがある場合、後から宣言されたものが先に実行されます。これはスタックのようにLIFO(後入れ先出し)で実行される為です。

3. 引数の評価タイミングはdeferの宣言時

次に、deferと関数の引数の評価タイミングについてです。次のソースコードを見てください:

package main

import (
	"fmt"
)

func printMessage(message string) {
    fmt.Println(message)
}

func main() {
    msg := "Hello"
    defer printMessage(msg)
    msg = "Goodbye"
}

このコードの出力はHelloでしょうか?、Goodbyeでしょうか?
実行結果は次のようになります:

Hello

deferによって遅延実行されるのは関数自体であり、引数はその場で評価されます。その為、deferを宣言した時点のHelloが出力されます。

まとめ

deferの基本的な特徴を3点紹介しました。deferはリソース管理や後処理を簡潔に行うことができます。是非、皆さんも活用してみてください!

1
0
1

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?