#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