如何在 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循环使用:=运算符自动推导出ab的类型。但是如果我想明确指定循环变量的类型怎么办?我尝试这样做是在第二块注释代码中,当然失败并出现以下错误。

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

你能帮我修复第二个代码块,这样我就可以明确指定 xy 的类型吗?

不幸的是,语言规范不允许您在 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)
    }
}