Golang初学者语法问题求助
Golang初学者语法问题求助 这是一个关于Go语言学习过程中的语法问题。
由于在使用“range for”时出现错误,所以发布一个新主题。
我的英语不太好,所以我用C++代码来展示。
预期的代码(现代C++)
std::vector<std::string> buffer = {"test", "test2", "test3"};
for ( auto &it : buffer)
printf ("%s", buffer.c_str());
编译后出现的错误
buffer := [...]string{"hehe", "hoho"}
for s := range buffer {
fmt.Printf("%s\n", s)
}
result ==>
%!s(int=0)
%!s(int=1)
为什么会发生这种情况?
更多关于Golang初学者语法问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
“for range”语法在使用单返回值时“返回”的是项的索引,或者在遍历映射时返回的是键。
要获取值,需要使用双元素形式:
for indexOrKey, value := range input { ... }
在Go语言中,range 的行为与C++的基于范围的for循环不同。当你在数组、切片或字符串上使用 range 时,它会返回两个值:索引和元素值(对于map,则是键和值)。如果你只接收一个变量,那么你得到的是索引,而不是元素值。
在你的代码中:
buffer := [...]string{"hehe", "hoho"}
for s := range buffer {
fmt.Printf("%s\n", s)
}
这里的 s 接收的是索引(整数),而不是字符串值。所以 fmt.Printf 试图将整数格式化为字符串,导致了 %!s(int=0) 这样的错误输出。
要修复这个问题,你有两种选择:
1. 同时接收索引和值(忽略索引):
buffer := [...]string{"hehe", "hoho"}
for _, value := range buffer {
fmt.Printf("%s\n", value)
}
2. 只接收值(Go 1.4+):
buffer := [...]string{"hehe", "hoho"}
for _, s := range buffer {
fmt.Printf("%s\n", s)
}
如果你想要最接近你C++示例的Go代码:
package main
import "fmt"
func main() {
buffer := []string{"test", "test2", "test3"}
for _, it := range buffer {
fmt.Printf("%s", it)
}
}
输出:
testtest2test3
关键点:
- 使用
[]string而不是[...]string来创建切片(更类似于C++的vector) - 在
range循环中使用_忽略索引,只获取值 range buffer返回(index, value)对
对于字符串切片,你也可以这样写:
buffer := []string{"test", "test2", "test3"}
for i := range buffer {
fmt.Printf("%s", buffer[i])
}
但第一种方式(使用 for _, value := range)更符合Go的惯用法,并且直接提供了元素值,不需要通过索引再次访问切片。

