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

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

// 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-scope, эти переменные не будут удалены после объем и упорствует весь внешний объем. Поэтому решение fist кажется лучшим, на мой взгляд.

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

1 ответов


просто не используйте := в этом случае и predeclare как 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 пример похож на предыдущий ответ.

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