golangのType Assertionメモ
- Type AssertionはC++のdynamic_cast的な機能。
- interfaceを別の型にキャストする時に使用。
- 2通りの受け方がある。
package main import ( "fmt" "errors" ) type MyError struct { i int } func (e *MyError) Error() string { return fmt.Sprintf("i = %d", e.i) } func check1(e error) { myErr, ok := e.(*MyError) if ok { fmt.Println(myErr) } else { fmt.Println("It's not *MyError") } } func check2(e error) { myErr := e.(*MyError) if myErr != nil { fmt.Println(myErr) } else { fmt.Println("It's not *MyError") } } func main() { e100 := &MyError{100} e200 := errors.New("200") check1(e100) check1(e200) check2(e100) check2(e200) // panic }
http://play.golang.org/p/MY2G3J_QPU
package main import ( "fmt" "strconv" ) func Println(x interface{}) { if i, ok := x.(int); ok { fmt.Println(strconv.Itoa(i)) return } if i, ok := x.(int64); ok { fmt.Println(strconv.FormatInt(i, 10)) return } if _, ok := x.(string); ok { fmt.Println("ニヤ(・∀・)ニヤ") return } } func main() { Println(int(100)) Println(int64(200)) Println("300") }