Go中奇怪的编译器错误

时间:2014-06-23 02:11:08

标签: compiler-errors go syntax-error

当我运行以下代码(它应该反转字符串的内容)时,我从编译器中得到奇怪的错误。

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]

我之前使用过这种语法(除非我遗漏了一些东西),而且我从未见过它的错误。我错过了什么?

2 个答案:

答案 0 :(得分:6)

根据规范,for statement有三种形式:

  1. 单个条件表达式
  2. 给出init语句,条件和发布语句的三个语句版本
  3. 范围条款。
  4. 您的陈述与其中任何一项都不匹配。很可能编译器已决定使用(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))
}