2014-06-29 23 views
8

Bugün Go öğrenmeye başladım ve değişken kapsamlarda takıldım.Golang: If deyimleri içeride değişken kapsamı

Nihayetinde bir if ifadesinin içinde bir değişken oluşturamadığım ve sonradan kullanabildiğim gerçeğini anlatabildim.

Bu benim kodum. Sorun, new1'in if ifadesinden önce oluşturulamamasıdır çünkü boyutu if ifadesinin sonucuna bağlıdır ve if ifadesinin içinde oluşturup if ifadesi bittikten sonra kullanamıyorum. Aklıma

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) 

tek şey bu gerçekten o zaman ben sonuçta Golang kullanmak istiyorum sanmıyorum çözüm ise oldukça dürüst olmak gerekirse

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

gibi bir şey yapmaktır.

Bunu çözmenin en iyi yolu nedir?

cevap

10

Sen if bloğundan önce new1 ilan edebilir ve iç make kullanın:

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

Tamam, teşekkür ederim. Yani bu dizi aslında ilk satırda mı yaratılıyor, yoksa sadece yaratılmaya hazır mı ve daha fazla küresel kapsamı var mı? – Alasdair

+0

Bu bir dizi değil, bir dilim. İlk satırda oluşturulur, ancak uzunluğunu (ve kapasitesini) tanımlamak için "make" işlevini kullanana kadar uzunluğu 0'dır. Ama yine de sıfır boyuttaki bir dilim 'örneğin' ile ekleyebiliyorsunuz: 'make' tek çözüm değil. – julienc

+0

Kafa karıştırıcı :) teşekkürler – Alasdair