Using golang constants in struct [SOLVED]

Using golang constants in struct [SOLVED]

In today’s post, we will discuss how to declare a constant in a Golang struct. For example:

Constants: There are boolean constants, rune constants, integer constants, floating-point constants, complex constants, and string constants. Rune, integer, floating-point, and complex constants are collectively called numeric constants.

A constant value is represented by a rune, integer, floating-point, imaginary, or string literal, an identifier denoting a constant, a constant expression, a conversion with a result that is a constant, or the result value of some built-in functions such as unsafe.Sizeof applied to certain values, cap or len applied to some expressions, real and imag applied to a complex constant and complex applied to numeric constants. The boolean truth values are represented by the predeclared constants true and false. The predeclared identifier iota denotes an integer constant.


Constants struct in Go

Go only supports four types of constants as above listed. It doesn’t support constant struct. So below example would raise an error:

package main

import "fmt"

type Person struct {
    name string
    age  int
}

func main() {
    const per = Person{
        name: "Harry Potter",
        age:  100000,
    }
    fmt.Println(per)
}

Output:

# command-line-arguments
.\structConst.go:11:14: Person{…} (value of type Person) is not constant

A solution is to have a function that returns a struct. In a way, that fulfills the purpose of a constant struct because it always returns the same struct:

package main

import "fmt"

type Person struct {
    name string
    age  int
}

func main() {
    per := constantPerson()
    fmt.Println(per)

    per2 := constantPerson()
    fmt.Println(per2 == per)
}

func constantPerson() Person {
    return Person{
        name: "Harry Potter",
        age:  100000,
    }
}

Output:

{Harry Potter 100000}
true

Declare golang constants in struct

For example, we want to declare constant in a struct. Let’s assume that constants.CONSTANT_STRING has the value “Hello world”. Then this syntax:

type Person struct {
    name string
    age  int
    constants.CONSTANT_STRING string
}

would evaluate to:

type Person2 struct {
    name string
    age  int
    "Hello world" string
}

which is incorrect syntax and has no semantic meaning. So in Golang, we can not directly declare a constant in a struct. If you want to assign a greeting (a constant string) to each Person variable, you can add an unexported field to the struct along with a method that returns greetingthe value. This way, code outside the package can read the constant string through the method but cannot directly access the variable:

package main

import (
    "fmt"
)

const (
    GREETING1 = "Hello World!"
    GREETING2 = "Bonjour!"
)

type Person struct {
    name     string
    age      int
    greeting string
}

func (per Person) getGreeting() string {
    return per.greeting
}

func main() {
    person1 := Person{
        name:     "Anna",
        age:      21,
        greeting: GREETING1,
    }
    fmt.Println("Greeting:", person1.getGreeting())
}

Output:

Greeting: Hello World!

Summary

In today’s post, I have given examples of declaring a constant struct or constants in a struct. In general, golang does not allow declaring a constant struct and constant within a struct. But we can use a custom function to perform this purpose. To understand more about using constant in golang, read the declare constant maps article.


References

https://go.dev/ref/spec#Constants

Tuan Nguyen

Tuan Nguyen

Data Scientist

Proficient in Golang, Python, Java, MongoDB, Selenium, Spring Boot, Kubernetes, Scrapy, API development, Docker, Data Scraping, PrimeFaces, Linux, Data Structures, and Data Mining. With expertise spanning these technologies, he develops robust solutions and implements efficient data processing and management strategies across various projects and platforms.