Welcome To Golang By Example

IOTA in Go (Golang)

This is the  chapter 22 of the golang comprehensive tutorial series. Refer to this link for other chapters of the series – Golang Comprehensive Tutorial Series

Next Tutorial – Goroutines
Previous Tutorial – Interface

Now let’s check out the current tutorial. Below is the table of contents for current tutorial.

Overview

Iota is an identifier which is used with constant and which can simplify constant definitions that use auto increment numbers.  The IOTA keyword represent integer constant starting from zero.  So essentially it can be used to create effective constant in Go . They can also be used to create enum in Go as we will see later in this tutorial.

Auto increment constant without IOTA

const (
    a = 0
    b = 1
    c = 2
)

Auto increment constant with IOTA

const (
    a = iota
    b
    c
)

Both will set

a=0
b=1
c=2

So IOTA is

IOTA starts with zero and increases by 1 after each line but there are some caveats as well. First, let’s see a simple example where iota starts with zero increases by 1 after each line

package main

import "fmt"

const (
    a = iota
    b
    c
)
func main() {
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
}

Output

0
1
2

Iota sets the value of a to zero. Then on each new line and it increments the value by one. Therefore the output is 0 followed by 1 followed by 2

More about IOTA

Let’s see some other points related to iota

const (
	a = iota
	b = iota
	c = iota
)

will output

0
1
2
const (
    a = iota
    b
    c = iota
)

will output

0
1
2
const (
	a = iota

	b
	//comment
	c
)

will output

0
1
2
const (
	a = iota
	b
)
const (
	c = iota
)

will output

0
1
0
const (
	a = iota
	_
	b
	c
)

will output

0
2
3
package main

import "fmt"

const (
	a = iota
	b = iota + 4
	c = iota * 4
)

func main() {
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
}

will output

0
5
8

The first-time iota value was zero, hence the output is zero.

On the next line iota value is 1 hence the output is 1+4=5.

On the next line, iota value is 2 hence output 2*4=8

const (
	a = iota + 10
	b
	c
)

will output

10
11
12

Enum in Golang

IOTA provides an automated way to create a enum in Golang. Let’s see an example.

package main

import "fmt"

type Size uint8

const (
	small Size = iota
	medium
	large
	extraLarge
)

func main() {
	fmt.Println(small)
	fmt.Println(medium)
	fmt.Println(large)
	fmt.Println(extraLarge)
}

Output

0
1
2
3

In above program we created a new type

type Size uint8

Then we declared some const of  type Size. The first constant small is set to iota so it will be set to zero

small Size = iota

That’s why

fmt.Println(small)      >> outputs 0  
fmt.Println(medium)     >> outputs 1
fmt.Println(large)      >> outputs 2
fmt.Println(extraLarge) >> outputs 3

Without IOTA we had to explicitly set the values of each of the enum value

package main

import "fmt"

type Size uint8

const (
	small      Size = 0
	medium     Size = 1
	large      Size = 2
	extraLarge Size = 3
)

func main() {
	fmt.Println(small)
	fmt.Println(medium)
	fmt.Println(large)
	fmt.Println(extraLarge)
}

Output

0
1
2
3

We can also define a method toString on Size type to print the exact value of enum . See below program

package main
import "fmt"
type Size int
const (
    small = Size(iota)
    medium
    large
    extraLarge
)
func main() {
    var m Size = 1
    m.toString()
}
func (s Size) toString() {
    switch s {
    case small:
        fmt.Println("Small")
    case medium:
        fmt.Println("Medium")
    case large:
        fmt.Println("Large")
    case extraLarge:
        fmt.Println("Extra Large")
    default:
        fmt.Println("Invalid Size entry")
    }
}

Output

medium

We have defined a toString method for the Size type. It can be used to the print the string value of the constant of Size type.

Conclusion

This is all about IOTA and Enum in golang. Hope you have liked this article. Please share feedback/improvements/mistakes in comments

Next Tutorial – Goroutines
Previous Tutorial – Interface