Compiler errors 围棋中奇怪的编译器错误

Compiler errors 围棋中奇怪的编译器错误,compiler-errors,go,syntax-error,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.

当我运行下面的代码(它应该反转字符串的内容)时,编译器会出现奇怪的错误

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]

我以前使用过这种语法(除非我遗漏了什么),而且我从未看到过错误。我遗漏了什么?

从规范中,a有三种形式:

  • 单个条件表达式
  • 提供init语句、condition语句和post语句的三语句版本
  • 范围从句
  • 你的陈述与这些都不相符。很可能编译器已确定您正在使用(1),并且在
    arrayPointer>=0
    之后没有
    {
    时出错。您可以通过更改为案例(2)来修复此问题:


    (或使用
    arrayPointer
    初始化语句作为
    for
    语句的第一部分)。

    从规范中,有三种形式可用于:

  • 单个条件表达式
  • 提供init语句、condition语句和post语句的三语句版本
  • 范围从句
  • 您的语句与其中任何一个都不匹配。很可能编译器已确定您正在使用(1),并且在
    arrayPointer>=0
    之后没有
    {
    时出错。您可以通过更改为案例(2)来修复此问题:


    (或使用
    arrayPointer
    初始化语句作为
    for
    语句的第一部分)。

    除了格式错误的
    for
    语句外,此代码还有一些错误(例如,您的
    arrayPointer
    初始化为
    len(argString)
    而不是
    len(argString)-1
    ,因此您将立即遇到越界违规)

    无论如何,我认为这是一个优化的、惯用的版本:

    主程序包
    输入“fmt”
    func main(){
    指令:=“我是一根弦”
    //使用输出缓冲区,因为(1)字符串是不可变的且
    //(2)追加到字符串将从现有字符串创建新字符串
    //字符串及其新附录。此方法分配
    //所有必要的内存1次.len(inString)分配
    //vs 1分配。
    突出部分:=制造([]单元8,透镜(安装))
    对于i:=0;i
    除了格式错误的
    for
    语句之外,此代码还有一些错误(例如,您的
    arrayPointer
    被初始化为
    len(argString)
    ,而不是
    len(argString)-1
    ,因此您将立即遇到越界违规)

    无论如何,我认为这是一个优化的、惯用的版本:

    主程序包
    输入“fmt”
    func main(){
    指令:=“我是一根弦”
    //使用输出缓冲区,因为(1)字符串是不可变的且
    //(2)追加到字符串将从现有字符串创建新字符串
    //字符串及其新附录。此方法分配
    //所有必要的内存1次.len(inString)分配
    //vs 1分配。
    突出部分:=制造([]单元8,透镜(安装))
    对于i:=0;i
    我不知道该怎么办,但在我看来,for循环中缺少一个初始值设定项……例如,
    arrayPointer:=len(argString)
    猜测您是作为练习编写的;无论哪种方式,当您可能需要逐个字符更改字符串时,使用数组切片都是有意义的:。Go中的字符串是不可变的,因此您不能只在其中添加一个字符。相反,每次通过循环时,您都会分配一个新字符串。我不知道Go,但在我看来,您是这样的for循环上缺少初始值设定项…例如,
    arrayPointer:=len(argString)
    猜测您是作为练习编写的;无论哪种方式,当您可能需要逐个字符更改字符串时,使用数组切片都是有意义的:。Go中的字符串是不可变的,因此您不能只在其中添加一个字符。相反,每次通过循环时,您都会分配一个新字符串。
    for ; arrayPointer >= 0 ; arrayPointer-- {
    
    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))
    }