16

定義済みの型を名前で再定義するだけのカスタム型がある場合:

type Answer string

そして、事前定義された型を受け入れる関数でそれを使用しようとします:

func acceptMe(str string) {
    fmt.Println(str)
}

func main() {
    type Answer string
    var ans Answer = "hello"

    // cannot use ans (type Answer) as type string in function argument
    acceptMe(ans)          
    // invalid type assertion: ans.(string) (non-interface type Answer on left)
    acceptMe(ans.(string)) 
    // Does work, but I don't understand why if the previous doesn't:
    acceptMe(string(ans))
}

型アサーションは失敗するのに、変換は機能するのはなぜですか?

4

1 に答える 1

23

型アサーションはインターフェイスに対してのみ機能します。インターフェイスは任意の基になる型を持つことができるため、型アサーションと型スイッチを使用してレスキューします。型アサーションはbool、アサーションが成功したかどうかを示す 2 番目の戻り値として返されます。

カスタム型Answerは、基になる型を 1 つだけ持つことができます。Answer正確な型 (および基になる型)は既にわかっていstringます。基になる型への変換は常に成功するため、アサーションは必要ありません。

古い答え:

カスタム タイプを に変換するだけstringです。カスタム型は基になる型として持っているため、変換は成功しますstring。変換構文: string(ans)。遊びに行きます

于 2013-09-09T05:35:24.187 に答える