2014-06-23 173 views
1

當我運行下面的代碼(它應該顛倒一個字符串的內容)時,我從編譯器中得到了奇怪的錯誤。奇怪的編譯器錯誤

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] 

我以前使用過這個語法(除非我失去了一些東西),我從來沒有見過從中錯誤。我錯過了什麼?

+1

我不知道去,但在我看來像你缺少上初始化對於循環...例如'arrayPointer:= len(argString);' – John3136

+0

猜測你是在寫它作爲一個練習;無論哪種方式,當你需要逐個字符地改變字符串時,使用數組切片是有意義的:http://play.golang.org/p/XOlnr7KP2Y。 Go中的字符串是不可變的,所以你不能只將一個字符附加到一個字符上。相反,你要分配一個新的字符串,每次通過你的循環。 – twotwotwo

回答

6

從規範,有三種形式的for statement

  1. 一個條件表達式
  2. 三個報表版本賦予一個初始化語句,條件和後聲明
  3. 一系列條款。

您的陳述不符合其中的任何一條。編譯器很可能已決定使用(1),並且在arrayPointer >= 0之後沒有{時出錯。您可以通過更改到外殼(2)解決這個問題:

for ; arrayPointer >= 0 ; arrayPointer-- { 

(或使用arrayPointer初始化語句作爲for聲明的第一部分)。

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)) 
}