ホームページ  >  記事  >  バックエンド開発  >  golang 関数クロージャパラメータの受け渡し

golang 関数クロージャパラメータの受け渡し

王林
王林オリジナル
2024-04-22 16:15:011158ブラウズ

Go 言語では、クロージャはパラメータ値または参照を渡すことができます。値を渡すと、クロージャ内に値のコピーが作成され、そのコピーに対する変更はクロージャ内でのみ有効で、元のパラメータには影響しません。参照を渡すと、クロージャ内のパラメータへのポインタが作成され、そのポインタが変更されます。元のパラメータを更新します。パラメーターが値によって渡される場合、元のパラメーターの値は変更されませんが、パラメーターが参照によって渡される場合、元のパラメーターの値は変更されます。

golang 関数クロージャパラメータの受け渡し

#Go 関数クロージャでのパラメータの受け渡し

はじめに

Go の中で言語では、クロージャは、そのスコープにその作成関数のスコープが含まれる関数です。これにより、クロージャは、作成関数が戻った後でも、作成関数で宣言された変数にアクセスして変更できるようになります。

パラメータの受け渡し

クロージャでパラメータを渡すときは、渡されるパラメータが値であるか参照であるかを考慮する必要があります。

  • 値の受け渡し: パラメーターの値を渡すと、クロージャー内にその値のコピーが作成されます。このコピーに加えられた変更はクロージャに限定され、元のパラメータには影響しません。
  • 参照渡し: パラメータへの参照を渡すと、クロージャ内にパラメータへのポインタが作成されます。このポインタを変更すると、元のパラメータが更新されます。

実践例

次の例は、クロージャを使用してパラメータを渡し、外部変数を変更する方法を示しています。

package main

import "fmt"

func main() {
    // 声明一个外层函数并传递一个值
    counter := func(num int) {
        num++ // 对参数的值进行修改
        fmt.Println("Value in closure:", num)
    }

    // 调用外层函数,传递一个值
    num := 10
    counter(num)

    fmt.Println("Value outside closure:", num) // 值不会改变
}

出力:

Value in closure: 11
Value outside closure: 10

この例では、

counternum の値を変更するクロージャです。ただし、num は値によって渡されるため、num への変更はクロージャに限定されますが、外部変数 num は変更されません。

参照渡し

パラメーターを参照渡しするには、ポインターを使用できます:

package main

import "fmt"

func main() {
    // 声明一个外层函数并传递一个引用
    counter := func(num *int) {
        *num++ // 对指针所指向的值进行修改
        fmt.Println("Value in closure:", *num)
    }

    // 调用外层函数,传递一个引用
    num := 10
    counter(&num)

    fmt.Println("Value outside closure:", num) // 值会改变
}

出力:

Value in closure: 11
Value outside closure: 11

この例では、たとえば、

num はポインターを介して渡されるため、クロージャーは外部変数 num の値を変更できます。

以上がgolang 関数クロージャパラメータの受け渡しの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。