golang

Determining a Variable Types in Golang (Get the Type of Variable)

Without a doubt, variables are the primary building blocks of any effective programming language. Unless you are working with esoteric languages like brainfuck that do not produce a production-level code, any other programming language has support and need for variables.

In Golang or Go, as we all know it, variables and data types are at the forefront of any code that we write.

When working in a language such as Go, you may encounter such instances where we need to determine and evaluate the type of value that is stored in a given variable. This can be for logging purposes or typecasting.

In this tutorial, we will walk you through all the methods and techniques that we can employ to determine the data type of a given variable in the Golang programming language.

Method 1: Using the Reflect Package

The first and most common method of determining the variable type in Go is using the “reflect” package.

In Go, the “reflect” package is a built-in package in the standard library that provides tools for examining the type and structure of values at runtime.

Reflection refers to the process of dynamically inspecting and manipulating the type, values, fields, and methods of Go objects.

We can use this package to inspect the type of variables at runtime. Consider the following example that demonstrates how to use it to determine the type of a given value:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var x interface{} = 3.14159
    t := reflect.TypeOf(x)

    fmt.Println("Type:", t)
}

In the given example code, we start by importing the “fmt” and “reflect” packages which allow us to print the output to the console and perform the reflection on types, respectively.

Next, we define a variable called “x” with a given value.

Lastly, we use the reflect.TypeOf() method to get the data type of the specified variable and print it to the console.

The previous code should return an output as follows:

Type: float64

As you can see, the previous code returns the data type of the specified variable.

NOTE: It is good to remember that using reflection for type checking can be relatively slow as it sacrifices the compile-type safety features provided by the Go compiler.

Method 2: Type Assertion

The following method that we have is known as type assertion. Type assertion refers to a mechanism that allows us to check whether an interface value holds a specific type and, if it does, determine the underlying value of the type.

A common use case of type assertion is when we have an interface type and we need to work with its concrete type.

For our case, we can use it to check the type of a given variable as shown in the following example:

package main
import "fmt"
func main() {
    var x interface{} = 3.14159

    if value, ok := x.(float64); ok {
        fmt.Printf("x is a float: %f\n", value)
    } else {
        fmt.Println("x is not an float")
    }
}

In the given example, we use the statement x.(float64) to assert whether “x” is of type float64. If successful, it assigns the underlying value to the value.

We can also use the type assertions to check if an interface variable is nil as demonstrated in the following example code:

package main
import "fmt"
func main() {
    var x interface{}
    if x == nil {
        fmt.Println("x is nil")
    } else {
        fmt.Println("x is not nil")
    }
}

The given example code checks if “x” is nil and prints the message.

Method 3: Type Switching

Type switching is a control structure in Go that allows us to perform the type assertion on an interface value against multiple types.

Think of it as a more concise and efficient way of handling the type assertion for multiple types instead of using a series of “if” statements.

An example of type switching is as follows:

package main
import "fmt"
func printType(x interface{}) {
    switch t := x.(type) {
    case float64:
        fmt.Println("x is an float:", t)
    case string:
        fmt.Println("x is a string:", t)
    default:
        fmt.Println("x is of unknown type")
    }
}

func main() {
    printType(3.14159)
    printType("Hello, Go!")
    printType([]int{1, 2, 3})
}

In this case, using type switching allows the previous code to correctly identify the types of variables that we pass to the printType() function.

An example output is as follows:

x is an float: 3.14159                                                                                                                                                                                    
x is a string: Hello, Go!                                                                                                                                                                                
x is of unknown type

Method 4: Using Fmt.Printf

In the “fmt” package, we have access to the “%T” format verb that allows us to print the type of a given variable.

This is a very simplistic, quick, and efficient method of printing out the type of a given variable without jumping into unnecessary hops of type conversion.

We can invoke it in a simple syntax as demonstrated in the following example code:

package main
import "fmt"
func main() {
    x := 3.14159
    fmt.Printf("Type of x: %T\n", x)
}

This should output the type of the value of “x” as shown in the following example output:

Type of x: float64

Conclusion

In this tutorial, we learned all the various methods and techniques that we can use to determine the type of a given variable. We covered the methods such as reflection, type assertion, type switching, and more.

About the author

John Otieno

My name is John and am a fellow geek like you. I am passionate about all things computers from Hardware, Operating systems to Programming. My dream is to share my knowledge with the world and help out fellow geeks. Follow my content by subscribing to LinuxHint mailing list