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有三种形式:
arrayPointer>=0
之后没有{
时出错。您可以通过更改为案例(2)来修复此问题:
(或使用
arrayPointer
初始化语句作为for
语句的第一部分)。从规范中,有三种形式可用于:
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))
}