Understanding Compile Errors
Go compile errors stop the build before any code runs:
./main.go:10:5: syntax error: unexpected token
./main.go:15:2: undefined: someVariable
./main.go:20:10: cannot use x (type int) as type string
./main.go:25:2: imported and not used: "fmt"
./main.go:30:8: missing return at end of functionEach error shows file, line, and column where the issue occurs.
Common Syntax Errors
Error: Unexpected Token
Problem code:
``go
func main() {
if x > 0 { // Missing closing brace somewhere
fmt.Println("positive")
else // Missing brace before else
fmt.Println("negative")
}
}
Error message:
``
./main.go:5:5: syntax error: unexpected else, expecting }
Solution:
``go
func main() {
if x > 0 {
fmt.Println("positive")
} else { // Add brace
fmt.Println("negative")
}
}
Error: Non-Declaration Statement Outside Function
Problem code: ```go package main
x := 10 // Error: non-declaration statement outside function body
func main() { fmt.Println(x) } ```
Solution: ```go package main
var x = 10 // Use 'var' at package level
func main() { fmt.Println(x) } ```
Error: Missing Return Statement
Problem code:
``go
func getValue() int {
if someCondition {
return 1
}
// Missing return for else branch
}
Error message:
``
./main.go:8:1: missing return at end of function
Solution:
``go
func getValue() int {
if someCondition {
return 1
}
return 0 // Add default return
}
Type Errors
Error: Cannot Use Type
Problem code:
``go
func main() {
var x int = 5
var y string = x // Error: cannot use x (type int) as type string
}
Solution:
``go
func main() {
var x int = 5
var y string = strconv.Itoa(x) // Convert properly
}
Error: Invalid Operation
Problem code:
``go
func main() {
var a int = 5
var b float64 = 3.14
result := a + b // Error: invalid operation: mismatched types
}
Solution:
``go
func main() {
var a int = 5
var b float64 = 3.14
result := float64(a) + b // Convert to matching type
}
Error: Assignment Count Mismatch
Problem code: ```go func main() { a, b := getValues() // Returns 3 values }
func getValues() (int, int, int) { return 1, 2, 3 } ```
Error message:
``
./main.go:2:10: assignment mismatch: 2 variables but getValues returns 3 values
Solution:
``go
func main() {
a, b, c := getValues() // Match all return values
// Or ignore some
a, b, _ := getValues()
}
Import Errors
Error: Imported and Not Used
Problem code: ```go package main
import ( "fmt" "os" // Not used anywhere )
func main() { fmt.Println("Hello") } ```
Solution: ```go package main
import "fmt" // Remove unused import
func main() { fmt.Println("Hello") } ```
Error: Package Not Found
Problem code: ```go package main
import "github.com/nonexistent/package"
func main() {} ```
Error message:
``
cannot find package "github.com/nonexistent/package"
Solution: ```bash # Fix module dependencies go mod tidy
# Download missing packages go mod download
# Check package exists go list -m github.com/nonexistent/package ```
Error: Circular Import
Problem code: ```go // package a package a import "myapp/b"
// package b package b import "myapp/a" ```
Error message:
``
import cycle not allowed
Solution: ```go // Create shared package for common types package shared
type Common struct { ... }
// package a package a import "myapp/shared"
// package b package b import "myapp/shared" ```
Function and Method Errors
Error: Too Many Arguments
Problem code: ```go func add(a, b int) int { return a + b }
func main() { result := add(1, 2, 3) // Error: too many arguments } ```
Solution: ```go func main() { result := add(1, 2) // Use correct number of arguments }
// Or make function variadic func add(nums ...int) int { total := 0 for _, n := range nums { total += n } return total } ```
Error: Not Enough Arguments
Problem code: ```go func greet(name string, age int) string { return fmt.Sprintf("%s is %d years old", name, age) }
func main() { greet("Alice") // Error: not enough arguments } ```
Solution: ```go func main() { greet("Alice", 25) // Provide all arguments }
// Or use optional parameters pattern func greetWithDefaults(name string, age int) string { if age == 0 { age = 18 // Default } return fmt.Sprintf("%s is %d years old", name, age) } ```
Error: Method Not Found
Problem code: ```go type User struct { Name string }
func main() { u := User{Name: "Alice"} u.GetName() // Error: u.GetName undefined } ```
Solution: ```go type User struct { Name string }
func (u User) GetName() string { // Define the method return u.Name }
func main() { u := User{Name: "Alice"} u.GetName() // Now works } ```
Module and Build Errors
Error: Go Mod Not Initialized
Problem code:
``bash
$ go build
go: cannot find main module; go.mod not found
Solution:
``bash
go mod init myapp
go mod tidy
go build
Error: Version Mismatch
Problem code:
``
module myapp requires go 1.21 but go version is 1.20
Solution: ```bash # Update go.mod to use available version go mod edit -go=1.20
# Or upgrade Go installation ```
Error: Build Constraints
Problem code: ```go // +build linux
package main
func main() {} // Won't build on Windows/Mac ```
Error message:
``
no Go files in main package (build constraints exclude all files)
Solution: ```bash # Build for specific platform GOOS=linux go build
# Or remove build constraint ```
Quick Diagnosis Commands
```bash # Format code to fix common syntax issues go fmt ./...
# Vet for common errors go vet ./...
# Full build with verbose output go build -v ./...
# Check specific file go build main.go
# Static analysis staticcheck ./... ```
IDE Integration
VS Code
Ensure Go extension is installed. It provides: - Real-time error highlighting - Auto-import suggestions - Format on save
GoLand
Built-in features: - Quick fixes for common errors - Import optimization - Refactoring tools
Verification Steps
```bash # Step 1: Format go fmt ./...
# Step 2: Vet go vet ./...
# Step 3: Build go build ./...
# Step 4: Test go test ./...
# All pass = code is valid ```
Common Error Quick Reference
| Error | Common Cause | Quick Fix |
|---|---|---|
| undefined | Variable not declared | Add var or := declaration |
| imported and not used | Unused import | Remove or use _ for side effects |
| syntax error: unexpected | Missing brace/paren | Check block structure |
| cannot use type | Type mismatch | Add explicit conversion |
| missing return | Incomplete return paths | Add default return |
| too many arguments | Wrong call signature | Check function definition |
| not enough arguments | Missing parameters | Provide all required args |
| assignment mismatch | Wrong variable count | Match return values |