https://golang.org/ref/spec#Short_variable_declarations
Unlike regular variable declarations, a short variable declaration may redeclare variables provided they were originally declared earlier in the same block (or the parameter lists if the block is the function body) with the same type, and at least one of the non-blank variables is new.
通常の変数宣言とは異なり、短い変数宣言では同じブロックで以前に宣言された変数(ブロックが関数本体の場合はパラメータリスト)と同じ型の変数と、空白以外の変数の、少なくとも1つを新しく追加される変数として再宣言できます。
同じ型であれば、前に宣言された変数は再宣言される事なく利用され、新しく追加された物のみが宣言されます。ですので以下は型が異なる err ですのでコンパイルエラーになります。
go
1package main
2
3import (
4 "errors"
5 "fmt"
6)
7
8func foo1() (int, error) {
9 return 0, nil
10}
11
12func foo2() (int, string) {
13 return 0, "foo"
14}
15
16func main() {
17 v1, err := foo1()
18 fmt.Println(v1, err)
19
20 v2, err := foo2()
21 fmt.Println(v2, err)
22}
https://play.golang.org/p/BvO1b_mZRx
また err が再利用されているかどうかは、以下で確認出来ます。
go
1package main
2
3import (
4 "errors"
5 "fmt"
6)
7
8func foo1() (int, error) {
9 return 0, nil
10}
11
12func foo2() (int, error) {
13 return 0, errors.New("foo2")
14}
15
16func main() {
17 v1, err := foo1()
18 fmt.Println(v1, err)
19 p := &err
20
21 v2, err := foo2()
22 fmt.Println(v2, err)
23
24 fmt.Println(*p)
25}
https://play.golang.org/p/_hMC3oDPn0
最初の err をポインタ p で預けておき、foo2 の呼び出し後にデリファレンスしています。新しい変数が宣言されているならば、*p
は nil になりますが、仕様通り変数が再利用されています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/11 06:37
2017/09/11 09:38