ホームページ  >  記事  >  バックエンド開発  >  特定の型を除外する制約を記述することは可能ですか?

特定の型を除外する制約を記述することは可能ですか?

王林
王林転載
2024-02-14 12:50:07703ブラウズ

特定の型を除外する制約を記述することは可能ですか?

php editor Strawberry は、特定の型を除外する制約の作成に関する記事を提供します。 PHP では、型制約を使用して関数やメソッドのパラメーターの型を制限できますが、特定の型を除外する制約を記述することは可能ですか?答えは「はい」です。 「!」演算子を使用すると、型制約から特定の型を除外できるため、より正確なパラメーターの型制限を実現できます。この記事では、「!」演算子を使用して型を除外する方法を詳しく説明し、実用的なコード例を示します。この興味深いトピックを一緒に探ってみましょう!

質問内容

type nonstring interface {
    // ???
}

func myfunc[t nonstring](v t) t {
    return v
}

func main() {
    myfunc(1)          // ok
    myfunc(false)      // ok
    myfunc([]string{}) // ok

    myfunc("hi, boy!") // i hope a comiler error occurs here!  
}

私が望むものは、上記のコードのコメントに記載されています。

golangでは可能でしょうか?

オリジナルシーン

次の 2 つの関数があります:

リーリー

any2string(v) は、任意の v を文字列に変換できます。ただし、v が整数の場合は、integer2string(v) の方がはるかに高速です。

したがって、コンパイラには、より高速な integer2string(v) が適用可能な場合に any2string(v) を呼び出さないようにしたいと考えています。

解決策

いいえ、これは不可能です。制約タイプのセットはセットの減算として表現できません。

どのタイプでも満たせない制約を定義できます。例:

リーリー

この制約では、型が正確に

int であり、メソッド foo() を持つ必要があります。事前に宣言された型にはメソッドを定義できないため、この制約を満たすことは不可能です。

ただし、「any-minus-int」や「any-plus-notsatisfiable」などの制約を定義することはできません。

関数が離散量タイプを除くすべてのタイプで同一である場合は、タイプ スイッチを使用するだけです:

リーリー

any 型の通常のパラメータは問題なく動作するため、ジェネリックスも必要ありません。

以上が特定の型を除外する制約を記述することは可能ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。