Go: Untyped numeric constants with no limits

Constants may be typed or untyped.

const a uint = 17
const b = 55

An untyped constant has no limits. When it’s used in a context that requires a type, a type will be inferred and a limit applied.

// Too big for an int
const big = 10000000000

// Still ok: "untyped = untyped * untyped"
const bigger = big * 100

// No problem: Result fits in an int
var i int = big / 100

// Compile time error: "constant 10000000000 overflows int"
var j int = big

The inferred type is determined by the syntax of the value. 123 for instance gets type int and 123.4 becomes a float64. The other possibilities are rune (alias for int32) and complex128.


Go does not have enumerated types. Instead, you can use the special name iota in a single const declaration to get a series of increasing values. When an initialization expression is omitted for a const, it reuses the preceding expression.

const (
    red = iota  // red == 0
    blue        // blue == 1
    green       // green == 2

The article Define an enumeration (enum) with a string representation has a detailed example.