当我运行以下代码(它应该反转字符串的内容)时,我从编译器中得到奇怪的错误。
package main
import "fmt"
func main(){
argString := "I am a string"
arrayPointer := len(argString)
outputString := "string"
for arrayPointer >= 0 ; arrayPointer-- {
outputString := fmt.Sprintf("%s%s", outputString, argString[arrayPointer])
}
}
它会引发以下错误:
prog.go:9: syntax error: missing { after for clause
prog.go:12: syntax error: unexpected }
[process exited with non-zero status]
我之前使用过这种语法(除非我遗漏了一些东西),而且我从未见过它的错误。我错过了什么?
答案 0 :(得分:6)
根据规范,for
statement有三种形式:
您的陈述与其中任何一项都不匹配。很可能编译器已决定使用(1),并且在{
之后没有arrayPointer >= 0
时出错。您可以通过更改为案例(2)来解决此问题:
for ; arrayPointer >= 0 ; arrayPointer-- {
(或使用arrayPointer
初始化语句作为for
语句的第一部分。)
答案 1 :(得分:1)
除了格式错误的for
语句之外,此代码还有一些错误(例如,您的arrayPointer
初始化为len(argString)
而不是len(argString)-1
,因此您可以点击立即违规 - >。
无论如何,我认为这是您尝试过的优化的惯用版本:
http://play.golang.org/p/fFCf3L8ov9
package main
import "fmt"
func main() {
inString := "I am a string"
// use an output buffer because (1) strings are immutable and
// (2) appending to strings creates a new string from the existing
// string and its new appendix. This method allocates
// all the necessary memory 1 time. len(inString) allocations
// vs 1 allocation.
outBuffer := make([]uint8, len(inString))
for i := 0; i < len(outBuffer); i++ {
// copy the i-th character from the end of the string
// into the i-th position of outBuffer
outBuffer[i] = inString[len(inString)-i-1]
}
fmt.Println(string(outBuffer))
}