How to Check the Type of a Value in Golang

Hey! If you love Go and building Go apps as much as I do, let's connect on Twitter or LinkedIn. I talk about this stuff all the time!

Want to learn how to build better Go applications faster and easier? You can.

Check out my course on the Go Standard Library. You can check it out now for free.


Hello, fellow Gophers! Today, we will dive deep into the world of Go, the powerful and versatile programming language created by Google. We’ll learn how to check the type of a value in GoLang, understand the theory behind it, and explore practical examples that you can apply to your own projects. Are you ready to level up your Go skills? Let’s get started!

The Basics: Understanding Static and Dynamic Typing

Before we jump into the actual process of checking the type of a value in Go, let’s make sure we’re clear on some basic concepts. Go is a statically typed language, which means that the type of a variable is determined at compile-time rather than at runtime. This can help prevent type-related errors and improve code readability.

However, there are times when you might need to work with values of unknown types, such as when you’re dealing with JSON data or user input. In these cases, it’s important to be able to check the type of a value at runtime to ensure your code behaves as expected.

Introducing the “Empty Interface” and Type Assertions

Go provides an elegant solution for working with values of unknown types: the empty interface (interface{}). An empty interface can hold values of any type, making it a versatile and powerful tool for your Go projects.

To check the type of a value stored in an empty interface, you can use a type assertion. Type assertions allow you to test whether an interface value holds a specific type and extract the value if the test is successful.

Here’s an example of how to use type assertions to check the type of a value stored in an empty interface:

package main

import "fmt"

func main() {
    var myValue interface{} = "Hello, World!"

    strValue, ok := myValue.(string)
    if ok {
        fmt.Printf("The value is a string: %s\n", strValue)
    } else {
        fmt.Println("The value is not a string.")
    }
}

In this example, we use the .(type) syntax to perform the type assertion. If the assertion is successful, the ok variable will be true, and we can safely use the strValue variable as a string.

Using the Type Switch for More Flexibility

For even more flexibility, Go also provides a type switch construct, which allows you to check a value against multiple types at once. This is particularly useful when you’re working with data that could be one of several different types.

Here’s an example of how to use a type switch to check the type of a value:

package main

import "fmt"

func checkType(value interface{}) {
    switch v := value.(type) {
    case string:
        fmt.Printf("The value is a string: %s\n", v)
    case int:
        fmt.Printf("The value is an integer: %d\n", v)
    default:
        fmt.Printf("The value is of an unknown type: %v\n", v)
    }
}

func main() {
    checkType("Hello, World!")
    checkType(42)
    checkType(true)
}

In this example, we use the .(type) syntax inside a switch statement to perform the type switch. The variable will hold the value of the correct type, and the corresponding case block will be executed.

The output of the example above will be:

The value is a string: Hello, World!
The value is an integer: 42
The value is of an unknown type: true

Reflection: Another Way to Check Types

Another way to check the type of a value in Go is by using the reflect package. The reflect package provides a more powerful and flexible way of working with types at runtime, allowing you to inspect and manipulate values in ways that are not possible with type assertions or type switches.

Here’s an example of how to use the reflect package to check the type of a value:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var myValue interface{} = "Hello, World!"

    valueType := reflect.TypeOf(myValue)
    fmt.Printf("The value is of type: %s\n", valueType)
}

In this example, we use the reflect.TypeOf() function to get the type of the value stored in the empty interface. The result is a reflect.Type value, which can be used to inspect the type in more detail or perform other operations.

Keep in mind that using reflection may have some performance implications, as it involves more runtime overhead than type assertions or type switches. It’s generally recommended to use type assertions and type switches when possible, and only resort to reflection when necessary.

When and Why to Check Types in Go

Now that we’ve explored how to check the type of a value in Go, you might be wondering when and why you’d want to use this technique in your projects.

Here are some common scenarios where checking the type of a value can be helpful:

  1. Working with JSON data: When decoding JSON data into Go structures, you might need to handle values that can be of different types (e.g., numbers, strings, or null). Type assertions and type switches can help you handle these cases gracefully.
  2. Dealing with user input: If you’re building a command-line tool or web application, you might need to process user input that could be of different types. Checking the type of the input can help you validate the data and provide better error messages.
  3. Writing reusable libraries: When creating libraries or functions that accept interface values, checking the type of the input can ensure that your code works correctly with a wide range of input types.

As you continue your journey as a Go programmer, you’ll likely encounter situations where checking the type of a value is essential for writing robust and flexible code. With the techniques we’ve discussed in this tutorial, you’ll be well-equipped to handle these challenges.

Wrapping Up

Congratulations on making it through this tutorial on checking the type of a value in Go! You’ve learned about the empty interface, type assertions, type switches, and the reflect package, and you’ve explored practical examples that demonstrate how and why to use these techniques in your Go projects.

With your newfound knowledge and understanding of Go’s powerful typing system, you’re well on your way to becoming a Go expert. Keep practicing, experimenting, and applying these concepts to your projects, and you’ll soon be writing more efficient, reliable, and flexible code. Happy coding!


Questions or comments? Reach out to me


Learn how to leverage the Go Standard Library like a PRO.

I just created a new course, The Go Standard Library, check it out!