Golang断言Type assertions
断言type assertion提供了access to an interface value's underlying concrete value.
直接断言
t := i.(T)
This statement asserts that the interface value i holds the concrete type T and assigns the underlying T value to the variable t.
If i does not hold a T, the statement will trigger a panic.直接断言会导致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.
t, ok := i.(T)
If i holds a T, then t will be the underlying value and ok will be true.
If not, ok will be false and t will be the zero value of type T, and no panic occurs.
Note the similarity between this syntax and that of reading from a map.
示例:
package main
import "fmt"
func main() {
	var i interface{} = "hello"
	s := i.(string)
	fmt.Println(s)
	s, ok := i.(string)
	fmt.Println(s, ok)
	f, ok := i.(float64)
	fmt.Println(f, ok)
	f = i.(float64) // panic
	fmt.Println(f)
}
输出
hello
hello true
0 false
panic: interface conversion: interface {} is string, not float64
goroutine 1 [running]:
main.main()
	/tmp/sandbox227310573/prog.go:17 +0x1fe
配合Switch
另外也可以配合switch语句进行判断:
package main
import "fmt"
func findType(i interface{}) {
    switch x := i.(type) {
    case int:
        fmt.Println(x, "is int")
    case string:
        fmt.Println(x, "is string")
    case nil:
        fmt.Println(x, "is nil")
    default:
        fmt.Println(x, "not type matched")
    }
}
func main() {
    findType(10)      // int
    findType("hello") // string
    var k interface{} // nil
    findType(k)
    findType(10.23) //float64
}
运行结果:
10 is int
hello is string
<nil> is nil
10.23 not type matched
References:
https://studygolang.com/articles/3314