😎

[Go] Type Assertion

2022/09/26に公開

これでもエラーは出ない。
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