2017-04-23 165 views
0

請參閱此代碼。如何在Go中聲明循環變量的變量類型?

package main 

import (
    "fmt" 
) 

func main() { 
    var arr [4]string = [4]string{"foo", "bar", "baz", "qux"} 

    for a, b := range arr { 
     fmt.Println(a, b) 
    } 

    // How can I fix this code? 
    /* 
    for x int, y string = range arr { 
     fmt.Println(a, b) 
    } 
    */ 
} 

第一個for循環使用:=操作者自動推斷的類型ab。但是,如果我想明確指定循環變量的類型呢?我試圖做到這一點是在第二塊評論代碼,當然因爲下面的錯誤而失敗。

# command-line-arguments 
./foo.go:15: syntax error: unexpected name, expecting { 
./foo.go:18: syntax error: unexpected } 

你能不能幫我解決的第二個代碼塊,這樣我可以指定類型的xy明確?

+0

([在for循環的初始化語句變量聲明】的可能的複製http://stackoverflow.com/questions/27960404/variable-declaration -in-init-statement-for-loop) –

+0

你爲什麼要這樣做?可能有更好的解決方案。 – Flimzy

+0

@Flimzy我想這樣做,以瞭解是否可能在Go語言中。 –

回答

1

不幸的是,語言規範不允許您在for循環中聲明變量類型。你可以得到的最接近的是這樣的:

var a int 
var b string 
for a, b = range arr { 
    fmt.Println(a, b) 
} 

但通常如果你給你的變量有意義的名稱,它們的類型將是明確的,以及:

for index, element := range arr { 
    fmt.Println(index, element) 
} 
1

您需要先vars申報。

var x int 
var y string ...// now it should be ok. 

for x,y = range arr { 
    fmt.Println(x, y) // it should be x and y instead of a,b 
} 

檢查fiddle

2

首先你的代碼是不是有效的Go代碼。 for範圍循環返回索引和數組,切片,字符串或映射的值,因此沒有理由明確指定值和索引的類型。

您正在指定變量初始化時的值的類型,並且語言會在範圍迭代中推導出類型。

一種特殊情況是當您使用interface{}作爲變量類型時。在這種情況下,如果您需要知道值的類型,則可以使用reflect包推斷該值的類型。

switch reflect.TypeOf(t).Kind() { 
case reflect.Slice: 
    s := reflect.ValueOf(t) 

    for i := 0; i < s.Len(); i++ { 
     fmt.Println(s.Index(i)) 
    } 
} 
+0

是否有理由在此語句中顯式指定變量的類型:var a int = 10?我猜不會。爲什麼這是允許的呢? –

+1

是的,有。從你的例子中,'10'是任何數字類型的有效值,例如'字節/ INT16/INT/int64'。如果不明確指定類型,編譯器會將該類型推斷爲「int」。如果你想聲明一個變量而不是'int',你需要明確地指定它:'var x float32 = 10' – putu

+0

@putu'var s string =「Foo」''怎麼樣?是否有理由在此語句中明確指定變量的類型? –

0

這是不可能的,因爲你想申報兩種不同類型的同一行數據,如果你想明確地聲明變量,那麼你就需要自己之前聲明它們像上面的答案,但如果你希望他們是其他類型的,那麼你需要隱蔽它們作爲您的需求,

package main 

import (
    "fmt" 
) 

func main() { 
    var arr = [4]string{"foo", "bar", "baz", "qux"} 

    var x int64 
    var b []byte 
    for x = 0; x < int64(len(arr)); x++ { 
     b = []byte(arr[x]) 
     fmt.Println(x, b) 
    } 
}