web-dev-qa-db-ja.com

非インターフェース値でスイッチを入力することはできません

次のダミーコードを使用して型アサーションで遊んでいて、エラーが発生しました。

非インターフェース値でスイッチを入力できません

それが何を意味するのか誰か知っていますか?

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

http://play.golang.org/p/Ti4FG0m1mc

21
Mingyu

タイプスイッチには、イントロスペクトへのインターフェイスが必要です。既知の型の値を渡すと、爆弾処理されます。パラメータとしてインターフェースを受け入れる関数を作成すると、機能します。

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

25
dethtron5000

型の表明の前にninterface{}にキャストするという答えを見つけました。

switch v := interface{}(n).(type)
38
Mingyu

型変換には2種類あります

  1. 基本データ型間の変換。このために直接キャストを使用できます

    i:= 48

    str:= string(i)

  2. ただし、value。(type)を使用した型変換は、クラス階層間の変換用です(たとえば、インターフェイスから特定の実装を取得したい場合)。そうでなければ、上記のエラーが発生します。

2
pr-pal

Goには型キャストはありません。型変換を行っています。

0
Volker