Golang 関数アドレスの魔法を明らかにする

WBOY
リリース: 2024-04-08 13:12:02
オリジナル
982 人が閲覧しました

関数アドレスはメモリ内の関数の場所であり、Go の & 演算子を使用して取得できます。関数アドレスは、引数 (コールバックなど) として渡すことも、リフレクションとともに使用して関数の詳細 (関数アドレスなど) を検査および操作することもできます。

揭秘 Golang 函数地址的魔法

Golang 関数アドレスの魅力を明らかにする

Golang では、関数は第一級市民です。 like 他の値と同様に、割り当て、渡され、比較されます。この機能は、コールバック、クロージャ、リフレクションなどのさまざまなプログラミング パターンを実装するための強力なツールを提供します。

関数アドレスは、メモリ内の関数の場所を指します。 Golang では、& 演算子を使用して関数のアドレスを取得できます。例:

func add(a, b int) int {
  return a + b
}

// 获取 add 函数的地址
funcAddr := &add
ログイン後にコピー

実際のケース: 関数をパラメーターとして渡す

関数アドレスをパラメーターとして他の関数に渡すことができます。これは Golang の一般的なパターンであり、コールバックと呼ばれます。たとえば、add 関数を sort.Sort 関数に渡して、スライスを並べ替えることができます。

package main

import (
  "fmt"
  "sort"
)

func main() {
  // 定义一个 int 切片
  nums := []int{5, 2, 9, 1, 3}

  // 按照升序对切片进行排序
  sort.Slice(nums, func(i, j int) bool {
    return nums[i] < nums[j]
  })

  fmt.Println(nums) // [1 2 3 5 9]
}
ログイン後にコピー

実践例: リフレクションの使用

リフレクションは、プログラムが実行時に型と値を検査および操作できるようにする Golang の高度な機能です。リフレクションを使用すると、アドレスを含む関数の詳細を取得できます。例:

package main

import (
  "fmt"
  "reflect"
)

func main() {
  // 获取 add 函数的类型信息
  funcType := reflect.TypeOf(add)

  // 获取函数的地址
  funcValue := reflect.ValueOf(add)
  funcPtr := funcValue.Pointer()

  fmt.Println(funcPtr) // 类似于 &add
}
ログイン後にコピー

関数アドレスを理解することで、第一級市民として Golang 関数を活用できるようになり、より柔軟で強力なプログラムを作成できるようになります。

以上がGolang 関数アドレスの魔法を明らかにするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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