2017-04-23 190 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) 
    } 
}