😎
[Go] Type Assertion
これでもエラーは出ない。
interface は、どんな型でも引数として受け付けることができるから。
package main
// interface は、どんな型でも引数として受け付けることができる
// やりたいこと:異なる型のものdo()に渡したい
func do(i interface{}) {
}
func main() {
do(10)
do("Mike")
do(true)
}
これだと、エラーになる。
インターフェースにインターフェースをかけることはできないから。
package main
import "fmt"
// interface は、どんな型でも引数として受け付けることができる
// やりたいこと:異なる型のものdo()に渡したい
func do(i interface{}) {
ii := i * 2
fmt.Println(ii)
}
func main() {
do(10)
// do("Mike")
// do(true)
}
ではどうするか。
タイプアサーションをする。
package main
import "fmt"
// interface は、どんな型でも引数として受け付けることができる
// やりたいこと:異なる型のものdo()に渡したい
func do(i interface{}) {
// int に直してから計算して出力している
ii := i.(int)
ii *= 2
fmt.Println(ii)
}
func main() {
do(10)
// do("Mike")
// do(true)
}
このようにインターフェースは、メソッドセットの定義をもとにして、いろんな型を総称するための仕組み。
なお、組み込み型errorは、Goのエラーを表す基本的な型である。
独自のエラー型を定義する場合でも、error型のインターフェースを満たすように実装するべき。
Discussion