Go Constants

Su Suriya Ravichandran Updated 14 Sep 2026
3 min read ·Lesson 6 of 12

A constant holds a value that cannot change after it is declared. Where a variable is a container you can update as your program runs, a constant is a fixed, named value — useful for things like configuration limits, mathematical values, or settings that should never be accidentally reassigned.

Constants are declared with the const keyword.

Syntax

const name type = value
  • name — the constant's identifier, following the same naming rules as variables.
  • type — optional; Go can infer it from the value.
  • value — must be provided at declaration. Unlike var, a constant can never be declared without a value and filled in later.
package main

import "fmt"

const MaxUsers = 100

func main() {
    fmt.Println("Maximum allowed users:", MaxUsers)
}

Key Rules for Constants

  • Must be assigned a value at the point of declaration.
  • Cannot be reassigned afterward — attempting MaxUsers = 200 later in the program is a compile error, not a runtime one, so the mistake is caught immediately.
  • Can be declared inside a function or at package level.
  • A constant's value must be computable at compile time — you can use a constant expression like 60 * 60, but not the result of a function call like time.Now().
  • Common Go style capitalizes the first letter of a constant when it should be exported (visible outside the package), following the same capitalization rule used for exported variables and functions — not because it is a constant, but because of Go's general visibility rule.

Typed vs. Untyped Constants

Go has a feature that surprises many newcomers: constants can be untyped, carrying no fixed type until they are actually used in an expression. This is different from variables, which always have a concrete type from the moment they exist.

Typed Constants

A typed constant behaves like an immutable variable of that exact type:

package main

import "fmt"

const TimeoutSeconds int = 30

func main() {
    fmt.Println("Timeout:", TimeoutSeconds)
}

Use a typed constant when you need strict type checking — for example, when passing it to a function that requires a specific parameter type.

Untyped Constants

An untyped constant has no fixed type of its own; Go assigns it a type based on the context where it's used, at compile time:

package main

import "fmt"

const Discount = 0.15

func main() {
    finalPrice := 200 * (1 - Discount)
    fmt.Println("Final price:", finalPrice)
}

Here, Discount has no fixed type. When it's used in 200 * (1 - Discount), Go treats it as a float64 because that's what the surrounding arithmetic requires. This flexibility is why untyped numeric constants can be freely mixed with int, float64, or other numeric types without an explicit conversion — something a typed variable could never do.

Advantages of untyped constants:

  • They adapt automatically to whatever numeric type an expression needs.
  • They avoid the type-mismatch errors you'd get mixing, say, an int variable with a float64 variable directly.

Grouping Constants

Related constants can be declared together in a block, which keeps configuration values organized and easy to scan:

package main

import "fmt"

const (
    AppName    = "ShopEasy"
    Version    = "1.0.0"
    MaxRetries = 3
)

func main() {
    fmt.Println(AppName, "Version:", Version)
    fmt.Println("Max retries:", MaxRetries)
}

Expected output:

ShopEasy Version: 1.0.0
Max retries: 3

Common mistake: trying to use := with constants. Short declaration only works for variables — constants must always use const, and always need =, not :=.

0 Comments

Reviewed before they appear

No comments yet.

Go Lang
Ask about this post
AI Ask about this post

Ask questions about Go Constants and get answers drawn from it.

Signed-in readers only.