如何在 Go 中为循环变量声明变量类型?
How to declare variable types for loop variables in 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循环使用:=
运算符自动推导出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)
}
您需要先声明 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
首先,您的代码不是有效的 Go 代码。 for range 循环 returns 数组、切片、字符串或映射的索引和值,因此没有理由显式指定值和索引的类型。
您在变量初始化时指定了值的类型,语言将在范围迭代中推导出类型。
一种特殊情况是当您使用 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))
}
}
这是不可能的,因为你试图在同一行中声明两种不同类型的数据,如果你想显式声明变量,那么你需要像上面的答案一样在自身之前声明它们,但是如果你希望它们是其他类型那么你需要根据你的需要隐藏它们,
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)
}
}
查看此代码。
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)
}
您需要先声明 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
首先,您的代码不是有效的 Go 代码。 for range 循环 returns 数组、切片、字符串或映射的索引和值,因此没有理由显式指定值和索引的类型。
您在变量初始化时指定了值的类型,语言将在范围迭代中推导出类型。
一种特殊情况是当您使用 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))
}
}
这是不可能的,因为你试图在同一行中声明两种不同类型的数据,如果你想显式声明变量,那么你需要像上面的答案一样在自身之前声明它们,但是如果你希望它们是其他类型那么你需要根据你的需要隐藏它们,
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)
}
}