This tutorial aims to provide a comprehensive understanding of type assertions and type switching in Go language.
By the end of this tutorial, you'll be able to:
- Understand the concepts of type assertion and type switching.
- Implement type assertions and type switches in Go.
- Understand the best practices associated with these concepts.
Basic understanding of Go language and its syntax.
A type assertion provides access to an interface value's underlying concrete value. It takes the form i.(T)
, where i
is an interface value and T
is the type we want to assert i
is.
var i interface{} = "hello"
s := i.(string)
fmt.Println(s) //outputs: hello
In the above example, we assert the type of i
to be string
.
If i
does not hold a T
, this statement will trigger a panic. To test whether an interface value holds a specific type, a type assertion can return two values: the underlying value and a boolean value that reports whether the assertion succeeded.
s, ok := i.(string)
fmt.Println(s, ok) //outputs: hello true
A type switch is a construct that permits several type assertions in series. It's a way to discover the dynamic type of an interface variable.
switch v := i.(type) {
case int:
fmt.Printf("Twice %v is %v\n", v, v*2)
case string:
fmt.Printf("%q is %v bytes long\n", v, len(v))
default:
fmt.Printf("I don't know about type %T!\n", v)
}
In the above example, the i
interface variable's dynamic type is checked against the int
and string
types.
Here is a practical example of type assertions and type switching:
package main
import "fmt"
func do(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("Twice %v is %v\n", v, v*2)
case string:
fmt.Printf("%q is %v bytes long\n", v, len(v))
default:
fmt.Printf("I don't know about type %T!\n", v)
}
}
func main() {
do(21)
do("hello")
do(true)
}
Output:
Twice 21 is 42
"hello" is 5 bytes long
I don't know about type bool!
This example demonstrates both type assertions and type switching. The do
function takes an interface value and uses a type switch to assert its type.
In this tutorial, we have covered:
- The concept of type assertions and type switching in Go.
- Practical examples of type assertions and type switches.
- Best practices with these concepts.
To continue learning, consider exploring more about interfaces in Go, as they play a significant role in understanding type assertions and type switches.
Write a function that takes an interface value and uses a type switch to assert its type to int
or string
. If it's neither, the function should print "unknown type".
Modify the function from exercise 1 to also handle float64
type. It should print the square of the number if the type is float64
.
Solutions to these exercises and more practice can be found in Go's official documentation and numerous Go programming books. Practice is key to mastering these concepts. Happy coding!