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")
}

http://play.golang.org/p/Qt7EPb-4kF