Перейти: Объявить и новую переменную и переписать переменную из более высокой области, как?

Я не могу найти ответ нигде, так что это ситуация:

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

Это второе объявление globalVar дает ошибку как тогда :=, так и когда используется '=':

  • С := он говорит globalVar declared and not used, потому что теперь globalVar - это новая переменная во внутренней области.
  • С = он говорит undefined err, потому что он еще не объявлен.

Итак, в принципе, должен быть способ определить разницу между = и := для каждой переменной в левой части объявления.

Я вижу два возможных решения, одинаково уродливые, на мой взгляд:

// 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
    }
}

Нужно ли мне использовать один из этих обходов или есть правильный способ достижения того, что мне нужно?

Второе решение кажется наименее уродливым, но если в области if существует много переменных, то эти переменные не будут удалены после области видимости и будут сохраняться во всей внешней области. Поэтому первое решение кажется лучшим на мой взгляд.

Но я хотел бы услышать, как другие решают эту ситуацию...

Ответ 1

Просто не используйте: = в этом случае и предопределяйте как globalVar, так и err.

var (
    globalVar string
    err error
)

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

или, если вы хотите ограничить область ошибок:

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

http://play.golang.org/p/73bF_tHYsC для примера, аналогичного предыдущему.

: = означает удобство, когда вы хотите объявить и назначить в одном выражении. Если это мешает, просто не используйте его.