ホームページ > バックエンド開発 > Golang > インターフェイスパラメーターを含む関数を使用すると Go で分散エラーが発生するのはなぜですか?

インターフェイスパラメーターを含む関数を使用すると Go で分散エラーが発生するのはなぜですか?

Patricia Arquette
リリース: 2024-12-29 18:06:17
オリジナル
223 人が閲覧しました

Why Does Go Give a Variance Error When Using Functions with Interface Parameters?

インターフェイス パラメーターを含む型 func: 分散エラーの説明

Go では、別の関数に引数として渡された関数を呼び出そうとします。 Interface{} 型では、「b への引数では (type func(int)) を myfunc 型として使用できません」というエラーが発生する可能性があります。このエラーは、Go インターフェースでバリアンスのサポートがないために発生します。

バリアンス

バリアンスとは、サブタイプがそのスーパータイプが予期される場所で使用される機能を指します。共変型システムでは、入力位置と出力位置の両方でサブタイプがスーパータイプを置き換えることができます。一方、反分散により、スーパータイプが入力位置のサブタイプを置き換えることができます。

Go インターフェイス

Go インターフェイスは分散を示しません。これは、interface{} を期待する関数に int を渡すことはできますが、func(int) と func(interface{}) には同じことが当てはまらないことを意味します。

エラーについて

この例では、func(int)int は func(interface{})int を実装していません。なぜなら:

  • func(int) は int パラメータを期待するのに対し、func(interface{}) はインターフェース{} パラメータを期待します。
  • func(int) は int を返しますが、func (interface{}) は、実装された任意の値を返すことができますインターフェイス{}.

解決策

エラーを解決するには、次のように、インターフェイス{}を期待する関数に func(int) を渡します。次のコード:

package main

import "fmt"

func foo(x interface{}) {
    fmt.Println("foo", x)
}

func add2(n int) int {
    return n + 2
}

func main() {
    foo(add2)
}
ログイン後にコピー

以上がインターフェイスパラメーターを含む関数を使用すると Go で分散エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート