Golang の Valuer インターフェイスと Scanner インターフェイスで型アサーションを正しく実装するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-06 16:46:02
オリジナル
422 人が閲覧しました

How Do I Correctly Implement Type Assertions in Golang's Valuer and Scanner Interfaces?

Golang の型アサーション: 値とスキャナーの実装のトラブルシューティング

Golang でカスタム型を作成する場合、この場合のロール型のように、データベース ドライバーの互換性のために、Valuer インターフェイスと Scanner インターフェイスを実装するのに共通です。ただし、これらのメソッド内で型アサーションの処理を誤ると、ユーザーがエラーに遭遇する可能性があります。

コードの抜粋に示すように、そのようなエラーの 1 つは、Scan メソッドの実装時の型変換の問題です。

func (r *Role) Scan(value interface{}) error {
    r = (*Role)(value.(string))
    return nil
}
ログイン後にコピー

このエラーは、変換された文字列値を逆参照されたロール ポインター (*Role) に不適切に割り当てることが原因で発生します。これを解決するには、正しい構文は次のとおりです:

func (r *Role) Scan(value interface{}) error {
    *r = Role(value.(string))
    return nil
}
ログイン後にコピー

さらに、パニックを避けるために s, ok := value.(string) を使用して変換の成功をチェックすることをお勧めします。

For Value メソッドの署名は、提供されたコードと異なります:

func (r Role) Value() (driver.Value, error) {
    return string(r), nil
}
ログイン後にコピー

この Value 実装は、NULL 値を処理または生成しません。

これらの型アサーションの問題に対処し、インターフェイスを実装することにより、正しくは、Role などのカスタム タイプを Golang アプリケーションのデータベース操作とシームレスに統合できます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!