这个 golang 代码的输出是什么?

What's the output of this golang code?

我的输出显示

.\main1.go:8: 无效的标识符字符 U+200b

.\main1.go:8:未定义: fmt in fmt.Print

我什至在 go playground 上试过同样的反应。

有人用相同的代码发布了答案“0 1 2 3”。

为什么我复制了相同的代码却得到了上面的结果。

package main

import "fmt"

func main() {
x := []string{"i","j","k","l"}
for v := range x {
  ​fmt.Print(v, " ")
  }
fmt.Println()
}

U+200b 显然是零宽度 space。它可能是在奇怪的复制粘贴后出现的。

尝试从头开始重写代码。

无论你从哪里复制它,都复制了一些额外的字符,特别是 unicode zero-dith space,并将它们放在 for ... range 语句的左大括号和 fmt.Print(...) 之间。查看十六进制编辑器中的粘贴输出会发现情况就是如此。如果您 select 并删除 fmt.Print 之前的这个字符,go fmt 将再次 运行 并且程序将编译。删除该语句之前的所有白色 space 也有效。

有两点需要注意:
首先:如果您使用简单的十六进制查看器查看源文件,您会在 fmt.Print(v, " "):
之前看到一些额外的十六进制字节 20 20 E2 80 8B
让我们删除它,现在我们有:

package main

import "fmt"

func main() {
    x := []string{"i", "j", "k", "l"}
    for v := range x {
        fmt.Print(v, " ")
    }
    fmt.Println()
}

现在输出是:
0 1 2 3

秒:
但通常我们使用变量名,如 v 表示值,var named i 表示索引,
所以看来代码需要注意:

package main

import "fmt"

func main() {
    x := []string{"i", "j", "k", "l"}
    for _, v := range x {
        fmt.Print(v, " ")
    }
    fmt.Println()
}

现在输出是:
我 j k l

您代码的第 8 行有 Zero Width Space 个字符,这是一个不可打印的字符。这可能在您复制的来源中。

删除空格后重写该行,如下所示。

package main

import "fmt"

func main() {
    x := []string{"i", "j", "k", "l"}
    for v := range x {
        fmt.Print(v, " ")
    }
    fmt.Println()
}

输出:

0 1 2 3

当您在代码上 运行 go fmt 时,它显示 filename.go:8:5: illegal character U+200B,它指定了 ZWSP 的位置。