This error occurs when a Go constant expression exceeds the maximum value of the target integer type (usually int on your specific architecture) during compile-time evaluation. You can fix it by explicitly casting the constant to a larger type like int64 or by ensuring the constant value itself fits within the int range for your platform.
Go constants are untyped until they are used in a context that requires a specific type. If you define a large number without a suffix, the compiler tries to fit it into the default int type. On 32-bit systems, int is 32 bits (max ~2.1 billion), while on 64-bit systems, it is 64 bits. If your constant exceeds the limit of the current architecture's int, the compiler throws "constant overflows int."
Here is a practical example of the error and the fix:
package main
import "fmt"
// This will fail on 32-bit systems because the value exceeds int32 max
// const BigNum = 3000000000
// Fix 1: Explicitly cast to int64 to bypass the default int limit
const BigNum = 3000000000
func main() {
// Without explicit type, this might still fail if the context expects int
// and the constant is too large for the target architecture's int.
// Correct approach: Assign to a variable of the correct type
var x int64 = BigNum
// Or define the constant with a type suffix if it's a literal
const BigNumLiteral int64 = 3000000000
fmt.Println(x)
fmt.Println(BigNumLiteral)
}
If you are working with bit shifts or arithmetic that results in a large constant, you must ensure the operation is performed on a type large enough to hold the result. For example, 1 << 32 overflows a 32-bit int.
package main
import "fmt"
func main() {
// Error: constant 4294967296 overflows int (on 32-bit)
// const Shifted = 1 << 32
// Fix: Ensure the literal '1' is treated as int64 before shifting
const Shifted int64 = 1 << 32
fmt.Println(Shifted)
}
To prevent this during development, always use explicit type suffixes (like int64) for large constants or when performing bitwise operations that might exceed 32-bit limits. If your code must run on both 32-bit and 64-bit systems, avoid relying on the default int size for large values; use int64 explicitly to guarantee consistent behavior across architectures.