2014-06-29 54 views
8

我剛剛開始學習Go,並且陷入了變量作用域。Golang:if語句中的變量範圍

我最終如何解決這個事實,即我不能在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畢竟。

那麼解決這個問題的最好方法是什麼?

回答

10

您可以if塊之前聲明new1和使用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) 
+0

好的,謝謝。那麼這個數組是在第一行中實際創建的,還是隻是讓它準備好被創建並擁有更多的全局範圍? – Alasdair

+0

這不是一個數組,而是一個切片。它在第一行創建,但其長度爲0,直到使用'make'來定義其長度(和容量)。但是,您仍然可以使用零大小的切片,例如'append':'make'不是唯一的解決方案。 – julienc

+0

混淆:)謝謝 – Alasdair