2014-06-29 18 views
8

Właśnie rozpocząłem naukę Go dzisiaj i utknąłem na zmiennych zakresach.Golang: zakres zmiennych wewnątrz instrukcji if

Ostatecznie byłem zdezorientowany tym, jak obejść fakt, że nie mogę utworzyć zmiennej wewnątrz instrukcji if i użyć jej później.

To jest mój kod. Problem polega na tym, że new1 nie może zostać utworzony przed instrukcją if, ponieważ jego rozmiar jest zależny od wyniku instrukcji if, a tworzenie go wewnątrz instrukcji if nie może go użyć po zakończeniu instrukcji 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) 

Jedyne co mogę myśleć o to, aby zrobić coś jak

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) { 
... 

Aby być całkiem szczery, jeśli jest to naprawdę rozwiązanie to nie sądzę, chcę użyć Golang po wszystkim.

Jaki jest najlepszy sposób rozwiązania tego problemu?

Odpowiedz

10

Można zadeklarować new1 przed blokiem if i używać make wewnątrz:

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) 
+0

OK, dziękuję. Czy ta macierz jest rzeczywiście tworzona w pierwszym wierszu, czy też tylko sprawia, że ​​jest ona gotowa do stworzenia i ma bardziej globalny zasięg? – Alasdair

+0

To nie jest tablica, ale kawałek. Jest tworzony w pierwszym wierszu, ale jego długość wynosi 0, dopóki nie użyjesz 'make' do zdefiniowania jego długości (i pojemności). Ale nadal możesz użyć wycinka o rozmiarze zerowym z 'append' na przykład:' make' nie jest jedynym rozwiązaniem. – julienc

+0

Mylące :) dzięki – Alasdair

Powiązane problemy