Numeric Constants

Numeric constants are high-precision values. They don’t have a fixed type until they’re used — an untyped constant takes whatever type its context requires.

That’s why Big (a number too large for any integer type) works fine when passed to needFloat, but would overflow if passed to needInt.

Try it — add needInt(Big) to main and see what happens. (int maxes out at 64 bits, sometimes less.)

package main

import "fmt"

const (
	// Create a huge number by shifting a 1 bit left 100 places.
	// In other words, the binary number that is 1 followed by 100 zeroes.
	Big = 1 << 100
	// Shift it right again 99 places, so we end up with 1<<1, or 2.
	Small = Big >> 99
)

func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
	return x * 0.1
}

func main() {
	fmt.Println(needInt(Small))
	fmt.Println(needFloat(Small))
	fmt.Println(needFloat(Big))
}