今回はgolangで「syntax error: unexpected~」というエラーが出たときの原因と解決策について紹介していきます。
golangで「syntax error: unexpected~」というエラーが出た
golangで開発を行っていると「syntax error: unexpected newline in argument list」というエラーに遭遇することがあります。
このエラーは基本的にはケアレスミスのときに頻発するエラーであるので、極力このエラーとは遭遇しないようにしていたいものです。そのためにもどんなシチュエーションで起きるエラーなのかとその対処法について理解しておきましょう。
「syntax error: unexpected~」の原因と対処法
括弧を閉じていない
関数を呼ぶタイミングなどで括弧()を書き忘れていたり、閉じれていなかったりするとsyntax errorが発生します。
例えば以下のコードはPrintlnの引数としてaを渡していますが、閉じ括弧を書いていません。
func main() {
a := 100
fmt.Println(a
}
このコードを実行すると以下のようにsyntax errorとなります。
main.go:7:15: syntax error: unexpected } in argument list; possibly missing comma or ) (exit status 1)
aを引数として渡す続きのコードとしては「,」か「)」を期待していましたが、予期していない「}」が来たことでエラーになっていることがわかります。
この場合はaのあとに閉じ括弧を書くことでエラーが解消されます。
func main() {
a := 100
fmt.Println(a)
}
修正して実行したら100と表示されました。
カンマを書いていない
golangでは配列やスライスのようにリスト形式で要素を改行して書く場合は末尾にカンマ(,)を書かなければいけません。
以下のようにスライスaに1,2,3という要素を入れていますが、このままではエラーが発生します。
func main() {
a := []int{
1,
2,
3
}
fmt.Println(a)
}
以下のようにカンマがないことでsyntax errorが発生します。
main.go:9:5: syntax error: unexpected newline in composite literal; possibly missing comma or } (exit status 1)
これを解消するためには末尾であったとしてもカンマ(,)を書くか、1行に折りたたんで宣言することで解消されます。
func main() {
a := []int{
1,
2,
3,
}
fmt.Println(a)
}
func main() {
a := []int{1, 2, 3}
fmt.Println(a)
}
このどちらかの書き方をすることでエラーが解消されます。どちらの書き方でも[1 2 3]と出力されます。
コロンを書いていない
以下のswitch文などで記法としてcaseやdefaultの後にコロン(:)が必要ですが、これを書き忘れているとsyntax errorが発生します。
func main() {
a := 1
switch a {
case 1
fmt.Println(a)
case 2:
fmt.Println("×")
default:
fmt.Println("×")
}
}
このコードを実行すると以下のように出力されます。
main.go:9:9: syntax error: unexpected newline, expected : (exit status 1)
case 1の後にはコロン(:)を期待していたところ、改行されたためエラーとなったことがわかります。
以下のようにcase 1の後にコロン(:)を書けばエラーは解消されます。
func main() {
a := 1
switch a {
case 1:
fmt.Println(a)
case 2:
fmt.Println("×")
default:
fmt.Println("×")
}
}
正常に動けば1と出力されます。
セミコロンを書いていない
Go言語ではセミコロン(;)を書く機会はそんなに多くないですが、必要な場合に書けていないとsyntax errorになります。
セミコロン(;)を書くと、複数の文を1行に記述することができるという仕様になっています。
しかし以下のコードのようにa := 1のあとに本来はセミコロン(;)が必要ですが、今回は書かれていないためエラーとなります。
func main() {
a := 1 b:=2
fmt.Println(a,b)
}
実行結果は以下のエラーが発生します。a := 1のあとにbが書かれていることでエラーになっていることがわかります。
main.go:6:9: syntax error: unexpected b at end of statement (exit status 1)
エラーを解消するにはa := 1のあとにセミコロン(;)を書く、もしくはa := 1のあとを改行します。
func main() {
a := 1; b:=2
fmt.Println(a,b)
}
func main() {
a := 1
b := 2
fmt.Println(a, b)
}
このどちらかのように実装すればエラーは解消されます。実行結果はどちらも1 2となります。
varの書き忘れ
golangでは変数の初期化時にvarを宣言する必要がありますが、これを書き忘れてもsyntax errorになります。
func main() {
a int
fmt.Println(a)
}
変数aを初期化しようとしていますが、varが書かれていないため実行すると以下のエラーになります。
main.go:6:4: syntax error: unexpected int at end of statement (exit status 1)
このエラーを解消するためには変数aの初期化時に文頭にvarを書きます。
func main() {
var a int
fmt.Println(a)
}
これでエラーは解消され正常実行することができます。ちなみに実行結果は初期化直後ということで0が出力されます。
中括弧を別の行に書いている
golangでは関数の処理は中括弧で括る必要がありますが、この中括弧は関数名と同一行に書かなければいけません。
以下のようにmain()と中括弧を別の行に書いている場合もsyntax errorにが発生します。
func main()
{
a :=1
fmt.Println(a)
}
こちらの実行結果は以下のようになります。
main.go:8:1: syntax error: unexpected semicolon or newline before { (exit status 1)
改行は期待していないという旨のエラーメッセージが表示されていますね。
こちらのエラーを解消するにはmain()と同一行に中括弧を書きます。
func main() {
a := 1
fmt.Println(a)
}
これで正常実行することができます。実行結果は1が出力されます。
演算子の書き間違い
計算や比較に用いる+,-,*,/,=などの演算子を書き間違えてもsyntax errorが発生します。
例えばfor文のように+を二つ重ねて書くとエラーになります。
func main() {
fmt.Println(1 ++ 1)
}
main.go:6:16: syntax error: unexpected ++ in argument list; possibly missing comma or ) (exit status 1)
他にも以下のように不要な箇所に=を書いてもエラーになります。
func main() {
fmt.Println(1=)
}
main.go:6:15: syntax error: unexpected = in argument list; possibly missing comma or ) (exit status 1)
このエラーについては以下のように演算子を正しく記載することで解消されます。
func main() {
fmt.Println(1 + 1)
}
「syntax error: unexpected~」というエラーは期待通りの文法でGoのコードを書けていないときに発生します。そのためエラーの原因は初歩的なものが多いため、まずはしっかりとGoの基礎について学ぶことをおすすめします。
golangをもっと詳しくなりたい方に
golang学習のために筆者が実際に受講したUdemy教材をまとめています。
golang学習のために筆者が実際に読んでおすすめしたい本をまとめています。