15

どこにも答えが見つからないので、これが状況です:

// err has not yet been declared here
globalVar := "string"
if globalVar == "string" {
    globalVar, err := doSomethingWithString()
    if err != nil {
        // error handling
    }
}

その 2 番目globalVarの宣言は、:='=' が使用されている場合と使用されている場合の両方でエラーになります。

  • これ:=globalVar declared and not used、globalVar が内部スコープの新しい変数であるためです。
  • =言うのはundefined err、まだ申告していないからです。

したがって、基本的には、宣言の左側にある変数ごとに=との違いを定義する方法が必要です。:=

私の意見では、どちらも同じように醜い2つの解決策があります。

// err has not yet been declared here
globalVar := "string"
if globalVar == "string" {
    globalVar2, err := doSomethingWithString()
    if err != nil {
        // error handling
    }
    globalVar = globalVar2
}

また

globalVar := "string"
var err error
if globalVar == "string" {
    globalVar, err = doSomethingWithString()
    if err != nil {
        // error handling
    }
}

これらの回避策のいずれかを使用する必要がありますか、または必要なものを達成する正しい方法はありますか?

2 番目の解決策は最も見栄えが悪いように見えますが、if スコープでのみ必要な変数が多数ある場合、これらの変数はスコープの後で削除されず、外側のスコープ全体が保持されます。したがって、私の意見では、最初の解決策が最善のようです。

しかし、他の人がこの状況をどのように解決するかを聞きたいです...

4

1 に答える 1

18

この場合は := を使用せず、globalVar と err の両方を事前宣言してください。

var (
    globalVar string
    err error
)

globalVar = "string"
if globalVar == "string" {
    globalVar, err = doSomethingWithString()
    if err != nil {
        // error handling
    }
}

または、代わりに err の範囲を制限したい場合:

globalVar := "string"
if globalVar == "string" {
    var err error
    globalVar, err = doSomethingWithString()
    if err != nil {
        // error handling
    }
}

前の回答に似た例については、http://play.golang.org/p/73bF_tHYsCを参照してください。

:= は、宣言と代入を 1 つのステートメントで行いたい場合に便利です。邪魔なら使わないだけです。

于 2013-06-14T16:10:30.263 に答える