golang で関数のアドレスは取得できないのに、関数の値は取得できるのはなぜですか

WBOY
リリース: 2024-02-10 19:30:20
転載
749 人が閲覧しました

为什么我不能获取 golang 中函数的地址,但可以获取函数值

php エディター Zimo が答えます: なぜ golang で関数のアドレスは取得できないのに、関数の値は取得できるのでしょうか? Golangでは関数値が呼び出せる型なので関数値を取得できます。関数のアドレスは取得できません。これは Golang の設計上の決定によって決まります。 Golang の関数は第一級市民であり、他の型と同様に割り当て、渡し、呼び出しが可能です。したがって、関数の値を取得して他の関数に渡すことができます。しかし、Golangの関数実装はクロージャによって実装されており、関数が作成されるたびに新たなクロージャインスタンスが生成されるため、関数のアドレスは固定ではなく取得することができません。このような設計により、機能の独立性と安全性を確保しながら、メモリ管理とガベージ コレクションのプロセスを簡素化できます。したがって、関数のアドレスを取得することはできませんが、関数の値を取得して呼び出すことはできます。

質問内容

golangで関数を宣言したとします:

リーリー

関数アドレスを使用して関数ポインタを宣言するとエラーになります

リーリー

「無効な操作: myfunc のアドレス (func() 型の値) を取得できません」

ただし、関数値に代入してアドレスを取得することはできます

リーリー

「functionvalue」は関数名「myfunc」を使用することと何か違いますか? どっちも同じタイプじゃないの? (関数 ())

Solution

myfunc は関数です。 functionvalue は関数変数で、関数とクロージャを指す変数です。例えば:### リーリー

上記の

functionvalue は、クロージャに x への参照が含まれる関数変数です。

myfunc

のような名前付き関数には、クロージャが関連付けられていません。 functionvalue のような関数変数にはクロージャがあります。 myfunc に割り当てると、クロージャは空になります。上記のように配置するとnullではなくなります。したがって、関数を呼び出すメカニズムは、関数変数を呼び出すメカニズムとは異なります。 関数変数のアドレスは、変数のアドレスです。

以上がgolang で関数のアドレスは取得できないのに、関数の値は取得できるのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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