ホームページ  >  記事  >  バックエンド開発  >  golang で関数のアドレスは取得できないのに、関数の値は取得できるのはなぜですか

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

WBOY
WBOY転載
2024-02-10 19:30:20750ブラウズ

为什么我不能获取 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 までご連絡ください。