LoginSignup
2
3

More than 5 years have passed since last update.

golangのdefer内で設定した戻り値は直接指定した戻り値よりも優先される

Last updated at Posted at 2016-09-10

名前付けされた戻り値

package main

func MascotName()(name string){//戻り値はnameで
    name = "gopher"
    return
}

func main(){
    fmt.Println(MascotName())
}

goでは関数宣言の時点で戻り値に名前を付けることが出来ます。
その場合、戻り値は指定する必要がなくなりますが、指定することも可能です。
下記のようにすることでgopher君は本来の名前を上書きされsuper gopher君となります。

package main

func MascotName()(name string){
    name = "gopher"
    return "super gopher"//こちらの方が優先度は上
}

func main(){
    fmt.Println(MascotName())
}

しかし更に上書きするトリックがあります。

package main

func MascotName()(name string){
    defer func(){
        name = "玉しゃぶりアジアンネズミ"//こちらの優先度は最強クラス
    }()
    name = "gopher"
    return "super gopher"
}

func main(){
    fmt.Println(MascotName())
}

deferによって、名前付けされた戻り値を上書きすることで、
super gopher君は玉しゃぶりアジアンネズミ君になります。

2
3
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
2
3