次のダミーコードを使用して型アサーションで遊んでいて、エラーが発生しました。
非インターフェース値でスイッチを入力できません
それが何を意味するのか誰か知っていますか?
package main
import "fmt"
import "strconv"
type Stringer interface {
String() string
}
type Number struct {
v int
}
func (number *Number) String() string {
return strconv.Itoa(number.v)
}
func main() {
n := &Number{1}
switch v := n.(type) {
case Stringer:
fmt.Println("Stringer:", v)
default:
fmt.Println("Unknown")
}
}
タイプスイッチには、イントロスペクトへのインターフェイスが必要です。既知の型の値を渡すと、爆弾処理されます。パラメータとしてインターフェースを受け入れる関数を作成すると、機能します。
func typeSwitch(tst interface{}) {
switch v := tst.(type) {
case Stringer:
fmt.Println("Stringer:", v)
default:
fmt.Println("Unknown")
}
}
ここで完全なコードを参照してください http://play.golang.org/p/QNyf0eG71_ およびインターフェイスに関するgolangのドキュメント http://golang.org/doc/effective_go.html#interfaces 。
型の表明の前にn
をinterface{}
にキャストするという答えを見つけました。
switch v := interface{}(n).(type)
型変換には2種類あります
基本データ型間の変換。このために直接キャストを使用できます
i:= 48
str:= string(i)
ただし、value。(type)を使用した型変換は、クラス階層間の変換用です(たとえば、インターフェイスから特定の実装を取得したい場合)。そうでなければ、上記のエラーが発生します。
Goには型キャストはありません。型変換を行っています。