茶漬けの技術メモ

Golang, Rubyで趣味開発します。テックニュース書いたり。ガジェット触ったり。

GOで複数戻り値を宣言済み変数に代入

タイトル通りなのですが
Golangで複数戻り値を持つ関数から得た値を
宣言済みの変数に代入する時に困ったのでメモ

やりたいこと

例えば、文字列を渡すと
渡した文字列と、その文字列に "juice" を付けて返す func があり
返り値は main package のグローバル変数に代入するとします

package main

import (
    "fmt"
)

// こいつに返り値を代入したい
var juice = "karappo"

func main() {
    {
        fruit, juice := makeJuice("orange")
        fmt.Println(fruit)
        fmt.Println(juice, &juice)
    }
    fmt.Println(juice, &juice)
}

func makeJuice(fruit string) (string, string) {
    return fruit, fruit+" juice"
}

ところが実行結果

orange
orange juice 0xc42000e1d0
karappo 0x1139150

となってしまい、グローバルな変数の juice に代入されるのではなく
ローカルな別の変数が新たに宣言されてしまいます

解決法

返り値は一旦ローカルな変数で受け取り
その後グローバルな変数に代入します

package main

import (
    "fmt"
)

var juice = "karappo"

func main() {
    {
        fruit, tmpJuice := makeJuice("orange")
        juice = tmpJuice
        fmt.Println(fruit)
        fmt.Println(juice, &juice)
    }
    fmt.Println(juice, &juice)
}

func makeJuice(fruit string) (string, string) {
    return fruit, fruit+" juice"
}

実行結果

orange
orange juice 0x1139150
orange juice 0x1139150

無事グローバル変数に返り値を代入することができました。