This error occurs because the := short variable declaration requires at least one new variable on the left side, but all variables listed have already been declared in the current scope. To fix it, replace := with = for reassignments, or ensure at least one variable in the list is new.
You typically see this when refactoring code where a variable was previously declared elsewhere, or when reusing variable names inside a loop or nested block. Go's compiler enforces this to prevent accidental shadowing or redeclaration errors.
Here is a common scenario where this happens inside a loop:
package main
import "fmt"
func main() {
// 'i' is declared here
i := 0
for {
// ERROR: 'i' is already declared in the outer scope.
// You cannot use ':=' to reassign an existing variable without a new one.
// i := i + 1 // This line would cause the panic
// FIX: Use '=' for reassignment
i = i + 1
if i > 5 {
break
}
fmt.Println(i)
}
}
If you need to declare a new variable alongside an existing one in the same statement, := is valid because the presence of the new variable satisfies the requirement:
package main
import "fmt"
func main() {
x := 10
// Valid: 'y' is new, so ':=' works even though 'x' exists
x, y := x+1, 20
fmt.Println(x, y) // Output: 11 20
}
Another frequent cause is accidental variable shadowing in nested blocks. If you declare a variable in an outer block and try to redeclare it with := in an inner block without adding a new variable, the compiler will reject it.
func process() {
name := "Alice"
if true {
// ERROR: 'name' is already declared in the outer scope.
// name := "Bob" // Invalid
// FIX: Use '=' to update the outer variable, or add a new variable
name = "Bob"
// Or, if you intended a new local variable:
// name, role := "Bob", "Admin"
}
}
To quickly fix this in your editor, simply change the := operator to = if you are only updating existing variables. If you intended to create a new variable, ensure you include at least one identifier that hasn't been defined in the current function or block scope.