2017-12-11 2 views
0

このコード:golangの便宜のために変数を再宣言しますか?

package main 

import (
    "fmt" 
) 

func main() { 
    fmt.Println("Hello, playground") 

    var a bool 
    var b interface{} 
    b = true 
    if a, ok := b.(bool); !ok { 
     fmt.Println("Problem!") 
    } 
} 

はgolang遊び場にこのエラーを得られます。

tmp/sandbox791966413/main.go:11:10: a declared and not used 
tmp/sandbox791966413/main.go:14:21: a declared and not used 

これが原因で、我々は短い変数宣言golang docsに読んだことの混乱である:通常のとは異なり

変数宣言、短い変数宣言があります。 変数の再宣言は、最初に宣言されていれば同一タイプ(ブロックがブロック本文の場合は同じリスト)の同じブロック(同じタイプ)と、少なくとも1つの非ブランク変数 が新しく追加されました。その結果、再宣言は、 複数変数の短い宣言にしか現れません。再宣言では、新しい変数 が導入されません。オリジナルに新しい値を割り当てます。だから、

、私の質問:

  1. は、なぜ私は上記のコードで変数を再宣言することはできませんか?
  2. は、より簡潔な方法でエラーを確認しながら関数の出力で変数を移入する 方法を見つける私はが本当にがやりたいものを、本当に私をされることができないと仮定すると。だから エラー可能な関数の値を取得するための次のフォームで改善する方法はありますか?

    var A RealType 
    if newA, err := SomeFunc(); err != nil { 
        return err 
    } else { 
        A = newA 
    } 
    

答えて

1

あなたは問題がある変数を、再宣言しました。変数を再宣言すると、別の変数になります。これは「シャドーイング」として知られています。あなたの2番目の質問については

import (
    "fmt" 
) 

func main() { 
    fmt.Println("Hello, playground") 

    // original a. 
    var a bool 
    var b interface{} 
    b = true 
    // redeclared a here. This is a a' 
    if a, ok := b.(bool); !ok { 
     // a' will last until the end of this block 
     fmt.Println("Problem!") 
    } 
    // a' is gone. So using a here would get the original a. 
} 

メイン

パッケージ。そのコードは素晴らしいようです。私はおそらくerr == nil(そしてifブロックとelseブロックを交換する)に切り替えます。しかしそれはスタイルのことです。

3

これは、新しい範囲を導入するif初期設定ステートメントで短い変数宣言を使用しているために発生しています。あなたがこれを行うことができます

if a, ok := b.(bool); !ok { 
    fmt.Println("Problem!") 
} 

aが再宣言されています:aは既存のシャドウ新たな変数である。このより

むしろ、okがあるので

a, ok := b.(bool) 
if !ok { 
    fmt.Println("Problem!") 
} 

これは動作します新しい変数であるので、aを再宣言することができ、あなたが引用した通貨が有効です。

同様に、2番目のコードスニペットのように書くことができます。

A, err := SomeFunc() 
if err != nil { 
    return err 
} 
+0

私はそれがもし外に短いdeclsを使用して、少し短くなっているとします。 – djhaskin987

関連する問題