目次
質問内容
ホームページ バックエンド開発 Golang any を使用して共通インターフェイスをインスタンス化します。構造体はそれを実装しません

any を使用して共通インターフェイスをインスタンス化します。構造体はそれを実装しません

Feb 08, 2024 pm 10:51 PM
overflow

any を使用して共通インターフェイスをインスタンス化します。構造体はそれを実装しません

#php エディターの Youzi が、any を使用してユニバーサル インターフェイスをインスタンス化する方法を紹介し、struct がそれを実装しない理由を説明します。ジェネリック インターフェイスは、コードを記述するときにより柔軟な方法を使用できるようにする非常に便利なデザイン パターンです。ただし、共通のインターフェイスを使用する場合は、不要な問題を避けるためにいくつかの詳細に注意を払う必要があります。 any を使用して汎用インターフェイスを適切にインスタンス化する方法を見て、構造体がそれを実装しない理由を理解しましょう。

質問内容

*DataToToType[any] を満たさない理由を誰か説明できますか?

すべての値をある構造体から別の構造体にコピーし、いくつかの明示的な値 (この場合は V) を設定する DTOer を構築してみます。

https://go.dev/play/p/-oobZrw5Ewe

// You can edit this code!
// Click here and start typing.
package main

import "fmt"

type DataFrom struct {
    V1 int
}

type DataTo struct {
    V int
}

func (m *DataTo) SetVal() {
    m.V = 1
    return
}

type ToType[T any] interface {
    SetVal()
    *T
}

type DTO[TFrom any, TTo ToType[any]] struct {
    Get func(from TFrom) TTo
}

func main() {
    dto := &DTO[DataFrom, *DataTo]{
        Get: func(from DataFrom) *DataTo {
            return &DataTo{V: from.V1 + 666}
        },
    }

    vFrom := DataFrom{V1: 1}
    vTo := dto.Get(vFrom)

    fmt.Println(vTo.V)
}
ログイン後にコピー

解決策

anyは静的型であるためです。

これを使用して

ToType のようなジェネリック型をインスタンス化する場合、ジェネリック型は正確に any を想定します。

現在、型パラメータの特定の使用法では、この問題が隠れている可能性があります。例:

リーリー

通常、

any は空のインターフェース interface{} のエイリアスであり、任意の型 All であるため、上記のように any に任意の型を指定できます。空のインターフェイスを満たします。

type パラメータが複合型 (例:

*T) に使用される場合、any を使用したインスタンス化は、 正確に *any## を意味します。 。したがって、ToType[any] は同じものと考えることができます: リーリー したがって、

*DataTo

は明らかに *any ではありません。詳細: 構造体ポインタをインターフェイス ポインタに割り当てる 構造体を次のように宣言すると、コンパイルされます:

リーリー

または、より「一般的」かつより詳細な方法:

リーリー

以上がany を使用して共通インターフェイスをインスタンス化します。構造体はそれを実装しませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

2009 年から 2025 年の誕生以来のビットコインの価格 BTC 過去の価格の最も完全な概要 2009 年から 2025 年の誕生以来のビットコインの価格 BTC 過去の価格の最も完全な概要 Jan 15, 2025 pm 08:11 PM

2009 年から 2025 年の誕生以来のビットコインの価格 BTC 過去の価格の最も完全な概要

Windows 11 の右下隅で時間がなくなった場合の対処方法_Windows 11 の右下隅で時間がなくなった場合の対処方法 Windows 11 の右下隅で時間がなくなった場合の対処方法_Windows 11 の右下隅で時間がなくなった場合の対処方法 May 06, 2024 pm 01:20 PM

Windows 11 の右下隅で時間がなくなった場合の対処方法_Windows 11 の右下隅で時間がなくなった場合の対処方法

Java 関数について質問したり議論したりできるコミュニティ フォーラムやディスカッション グループはありますか? Java 関数について質問したり議論したりできるコミュニティ フォーラムやディスカッション グループはありますか? Apr 28, 2024 pm 02:12 PM

Java 関数について質問したり議論したりできるコミュニティ フォーラムやディスカッション グループはありますか?

Pythonで他の人のコードを使用する方法 Pythonで他の人のコードを使用する方法 May 05, 2024 pm 07:54 PM

Pythonで他の人のコードを使用する方法

win11 コンピューターの時刻が常に間違っている場合はどうすればよいですか? Windows 11コンピュータで間違った時刻を調整する方法 win11 コンピューターの時刻が常に間違っている場合はどうすればよいですか? Windows 11コンピュータで間違った時刻を調整する方法 May 03, 2024 pm 09:20 PM

win11 コンピューターの時刻が常に間違っている場合はどうすればよいですか? Windows 11コンピュータで間違った時刻を調整する方法

Java関数開発における一般的な例外の種類とその修復方法 Java関数開発における一般的な例外の種類とその修復方法 May 03, 2024 pm 02:09 PM

Java関数開発における一般的な例外の種類とその修復方法

CSSでのオーバーフローとはどういう意味ですか CSSでのオーバーフローとはどういう意味ですか Apr 28, 2024 pm 03:15 PM

CSSでのオーバーフローとはどういう意味ですか

Douyin のランダムなアカウントを管理する人はいませんか?二度目の異議申し立てはできますか? Douyin のランダムなアカウントを管理する人はいませんか?二度目の異議申し立てはできますか? May 03, 2024 am 09:37 AM

Douyin のランダムなアカウントを管理する人はいませんか?二度目の異議申し立てはできますか?

See all articles