2016-07-03 11 views
0

条件文の外にいくつかの変数(offsetIおよびlimitI)が宣言されています。条件文の中で私はそれらの値を代入しようとしていますが、条件文の後にそれらの値をクエリに使用します。変数が宣言され、条件文で使用されません

var (
    number, size, offset, limit string 
    offsetI, limitI    uint64 
) 

// Get the string values for number, size, offset, and limit 
// ... 

if size != "" { 

    // Parse the number value 
    numberI, err := strconv.ParseUint(number, 10, 64) 
    if err != nil {...} 

    // Parse the size value 
    limitI, err = strconv.ParseUint(size, 10, 64) 
    if err != nil {...} 

    // Calculate the offset 
    offsetI = numberI * limitI 

} else { 

    // Parse the limit value 
    limitI, err := strconv.ParseUint(limit, 10, 64)   // limitI declared and not used 
    if err != nil {...} 

    // Parse the offset value 
    offsetI, err = strconv.ParseUint(offset, 10, 64) 
    if err != nil {...} 
} 

// Make the query using offsetI and limitI 
result, err := s.GetAllPaginated(offsetI, limitI) 
if err != nil {...} 

私はelse文のスコープ内で再宣言limitI変数を意図するものではないのですが、私は新しいerr変数を宣言するため:=演算子を使用する必要があります。

私が思い付くことができる唯一の事は別に、別のerr変数を宣言することだったので、私は通常の代入文を使用することができます。

} else { 

    var err error // New 

    // Regular assignment statement now 
    limitI, err = strconv.ParseUint(limit, 10, 64) 
    if err != nil {...} 

私はせずにこれを実行できるようにしたいと思います追加のエラー変数を宣言します。

+0

これは厄介ですが、はい、まさにあなたがしなければならないことです。 ':='は、左側に複数の変数を指定すると、同じスコープ内にまだ宣言されていない_all_を再宣言します。 – twotwotwo

答えて

1

余分なvar errorは厄介ですが、この状況に対処する一般的な方法です。 The spec on scopingは言う(強調鉱山):

関数内で宣言定数または変数識別子の範囲がConstSpecまたはVarSpec(短い変数宣言のためShortVarDecl)の端部で始まり、最も内側の端部で終了含有ブロック

だからあなたの場合には、その短い変数の宣言は異なるlimitIはにスコープ「ブロックを含む最も内側の。」と宣言されます次の閉じ括弧までは「生きる」ため、使用されません。あなたの特定のケースで

は、オプションでは、それは両方の内側のスコープで使われているので、もし/他の外errを宣言するかもしれないので、あなたはerror秒を返すこれらの関数を使用=の代わり:=を使用することができます。それでは、 "limitI"の宣言はなく、未使用の変数の問題はありません。

このような「シャドーイング」状態は、エラーではなく予期しない動作を引き起こす可能性があります。 go vet -shadowtries to detect "[v]ariables that may have been unintentionally shadowed"と異なり、関連しているが、は、「未使用変数」チェックを一般化して、宣言でなくても無駄な割り当てを検出します。

関連する問題