Область действия переменной внутри операторов if

#go

#Вперед

Вопрос:

Я только начал изучать Go сегодня и застрял на переменных областях.

В конечном итоге я запутался в том, как обойти тот факт, что я не могу создать переменную внутри оператора if и использовать ее позже.

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

 if len(array1)>len(array2) {
    new1 := make([]string,0,len(array1))
    mc := Array2Map_string(array1)
    for _,tok :=range array2 {
        _, ok := mc[tok]
        if ok {
            new1[len(new1)]=tok
            }
        }
    } else {
    new1 := make([]string,0,len(array2))
    mc := Array2Map_string(array2)
    for _,tok :=range array1 {
        _, ok := mc[tok]
        if ok {
            new1[len(new1)]=tok
            }
        }
    }
new2 := make([]string,0,len(new1))
copy(new2, new1)
  

Единственное, о чем я могу думать, это сделать что-то вроде

 var pointlessvariable uint
if len(array1)>len(array2) {
pointlessvariable=len(array1)
} else {
pointlessvariable=len(array2)
}
var new1 = make([]string,0,pointlessvariable)
if len(array1)>len(array2) {
...
  

Честно говоря, если это действительно решение, то я не думаю, что в конце концов захочу использовать Golang.

Итак, каков наилучший способ решения этой проблемы?

Ответ №1:

Вы можете объявить new1 перед if блоком и использовать make внутри:

 var new1 []string

if len(array1)>len(array2) {
    new1 = make([]string, 0, len(array1))
    // instructions ...
} else {
    new1 = make([]string, 0, len(array2))
    // other instructions ...
}

new2 := make([]string, 0, len(new1))
copy(new2, new1)
  

Комментарии:

1. Хорошо, спасибо. Итак, действительно ли этот массив создается в первой строке, или это только делает его готовым к созданию и имеет более глобальную область действия?

2. Это не массив, а фрагмент. Она создается в первой строке, но ее длина равна 0, пока вы не используете make для определения ее длины (и емкости). Но вы все равно можете использовать фрагмент нулевого размера append , например: make это не единственное решение.

Ответ №2:

Что касается вопроса о области видимости переменной, новичкам (программистам go) может показаться интересным, что вы также можете произвольно принудительно использовать область видимости переменной с помощью пары фигурных скобок { } в любом месте кода. Для этого вам не нужно ключевое слово.

Пример:

 // outside of scope
var color = "blue"

{
    // inside a new scope
    var color = "red"
    fmt.Println(color) // prints red
}

// outside of scope again
fmt.Println(color) // prints blue again