For loop 如何在Go中声明循环变量的变量类型?
请参阅此代码For loop 如何在Go中声明循环变量的变量类型?,for-loop,go,variable-declaration,For Loop,Go,Variable Declaration,请参阅此代码 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 = rang
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循环使用:=
运算符自动推断a
和b
的类型。但是如果我想显式地指定循环变量的类型呢?我尝试这样做是在注释代码的第二块中,当然失败了,出现了以下错误
# command-line-arguments
./foo.go:15: syntax error: unexpected name, expecting {
./foo.go:18: syntax error: unexpected }
您能否帮助我修复第二块代码,以便我可以明确指定
x
和y
的类型?不幸的是,语言规范不允许您在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)
}
您需要首先声明
变量
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
}
首先检查您的代码是否为无效的Go代码。for range循环返回数组、切片、字符串或映射的索引和值,因此没有理由显式指定值和索引的类型 您在变量初始化时指定了值的类型,语言将在范围迭代中推断出该类型 一种特殊情况是使用
接口{}
作为变量类型。在这种情况下,如果需要知道值的类型,可以使用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))
}
}
switch reflect.TypeOf(t).Kind(){
case reflect.Slice:
s:=反射值(t)
对于i:=0;i
这是不可能的,因为您试图在同一行中声明两种不同类型的数据,如果您想要显式声明变量,那么您需要像上面的答案一样在声明变量之前声明它们,但是如果您想要它们是另一种类型,那么您需要根据需要对它们进行转换
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)
}
}
主程序包
进口(
“fmt”
)
func main(){
var arr=[4]字符串{“foo”、“bar”、“baz”、“qux”}
var x int64
变量b[]字节
对于x=0;x
可能重复您为什么要这样做?可能有更好的解决方案。@Flimzy我想这样做是为了了解在围棋语言中是否可行。在围棋中不可能这样做。根据您的具体需求,可以通过其他方式实现相同的目标。可能的重复是否有理由在此语句中明确指定变量的类型:var a int=10
?我想不是。那为什么这是允许的?是的,有。根据您的示例,10
是任何数字类型的有效值,例如byte/int16/int/int64
。如果不显式指定类型,编译器会将该类型推断为int
。如果要声明除int
以外的变量,则需要明确指定它:var x float32=10
@putuvar s string=“Foo”
?是否有理由在此语句中显式指定变量的类型?引用语言规范():“与常规变量声明不同,短变量声明可能会重新声明变量,前提是这些变量最初是在同一块中声明的(如果块是函数体,则为参数列表)具有相同的类型,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不会引入新变量,只会为原始变量分配一个新值。“如果右侧值的类型是“唯一的”,您不需要显式指定变量类型。显式指定类型将使声明更长,而无需添加信息(与短版本相比)。