ホームページ  >  記事  >  バックエンド開発  >  Go で `Valuer` および `Scanner` インターフェイスを実装すると型アサーションが失敗するのはなぜですか?

Go で `Valuer` および `Scanner` インターフェイスを実装すると型アサーションが失敗するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-06 20:00:04412ブラウズ

Why Does Type Assertion Fail When Implementing `Valuer` and `Scanner` Interfaces in Go?

Golang の型アサーションを理解する

Go では、型エイリアスを使用して既存の型に基づいてカスタム型を定義できます。指定されたシナリオでは、Role タイプは組み込み文字列タイプのエイリアスです。ただし、このカスタム タイプの Valuer インターフェイスと Scanner インターフェイスを実装すると、エラーが発生します。

エラーへの対処

エラー メッセージは、次の問題があることを示唆しています。 Scan メソッドでの型変換。具体的には、変換された値をロールへのポインターに割り当てようとする試みについて警告します。

最初の関数 Scan は、データベースから値を抽出し、それを適切な型に変換する役割を果たします。問題は代入行にあります:

r = (*Role)(value.(string))

式 value.(string) は、value パラメーターを文字列に変換しようとします。ただし、割り当てでは、この変換された値をロールへのポインターに割り当てようとします。宛先のタイプは、Role ではなく *Role である必要があるため、これは不正確です。修正されたコードは次のとおりです。

func (r *Role) Scan(value interface{}) error {
    *r = Role(value.(string))
    return nil
}

2 番目の関数 Value は、値をデータベース互換形式に変換します。指定されたコードは、driver.Valuer の予期される関数シグネチャに従っていないため、正しくありません。修正されたコードは次のとおりです。

func (r Role) Value() (driver.Value, error) {
    return string(r), nil
}

結論

Scan メソッドの型変換を修正し、Value メソッドの関数シグネチャを調整することで、コードは機能するはずです。意図したとおり、カスタム ロール タイプがデータベース ドライバーと対話できるようになります。

以上がGo で `Valuer` および `Scanner` インターフェイスを実装すると型アサーションが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。