関数アドレスは関数自体のメモリ アドレスを指し、ポインタは変数または構造体のメモリ アドレスを指します。ただし、関数アドレスをポインターに格納することもでき、ポインターを介して関数を呼び出すことができます。これらの概念は、関数の動的呼び出しやコールバック関数の作成など、さまざまなシナリオで役立ちます。
Go における関数アドレスとポインタ: 微妙な関係
Go 言語では、関数アドレスとポインタは似ているように見えますが、それらの間には微妙な違いがあります。それらの違いを理解することは、効率的で保守可能なコードを作成するために重要です。
関数アドレス
関数アドレスは、関数自体のメモリ位置を指すアドレスです。これは、コンパイラで生成された func
リテラル、または reflect
パッケージの ValueOf
または Func
関数を通じて取得できます。
ポインタ
ポインタは、別の値のアドレスを格納する変数です。 Go では、#* シンボルと型名を使用してポインターを宣言できます。たとえば、
*int は整数値へのポインタです。
両者の関係
関数アドレスとポインタは異なるものを指します。関数アドレスは関数自体のメモリ アドレスを指し、ポインタは変数または構造体のメモリ アドレスを指します。ただし、関数アドレスをポインタに格納することもできます。 次の例では:func myFunc() {} var fptr = &myFunc
fptr は関数
myFunc のアドレスを指すポインターです。これにより、ポインターを介して関数を呼び出すことができます。
(*fptr)() // 等同于 myFunc()
実践的な例
関数のアドレスとポインターは、さまざまなシナリオで役立ちます。これらの概念を利用した実際の例を次に示します。package main import ( "fmt" "math" ) // 计算半径的函数 func radius(n int) float64 { return float64(n) / 2.0 } // 求一个数字的根的函数 func sqrt(n int) float64 { return math.Sqrt(float64(n)) } var operations = map[string]func(int) float64{ "radius": radius, "sqrt": sqrt, } func main() { input := "sqrt" num := 9 // 通过名称获取函数指针 op := operations[input] // 调用函数并打印结果 fmt.Println(op(num)) }この例では、関数アドレスを辞書に保存し、実行時に関数名によって動的に呼び出す方法を示します。
以上がGolang関数のアドレスとポインタの微妙な関係の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。