Go 言語では、関数とは、単一の特定の関数または関連する関数を実装するために使用される、整理された再利用可能なコード セグメント (ブロック) です。その主な目的は、アプリケーションのモジュール性とコードの効率を向上させることです。再利用、コード管理の改善、モジュール開発。関数は通常、パラメーターと戻り値を使用して呼び出し元と対話します。パラメーターはデータを関数に渡し、値を返し、関数は処理されたデータを呼び出し元に渡します。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
関数は、単一関数または関連関数を実装するために使用される、整理された再利用可能なコード セグメントであり、アプリケーションのモジュール性とコードの再利用率を向上させることができます。
#関数の概要
関数、関数、特定の関数を実装するために使用される独立したコード ブロック。主な目的は、コードの再利用 (再利用)、コード管理の改善、モジュール開発です。関数は通常、パラメーターと戻り値を使用して呼び出し元と対話します。パラメーターは関数にデータを渡し、値を返し、関数は処理されたデータを呼び出し元に渡します。 Go 言語の関数は第一級市民と呼ばれます。これは、高階関数、匿名関数、クロージャなどの機能をサポートし、インターフェイスなどの高度な関数機能に対応できることを意味します。関数定義
関数はコード実行の論理構造を構成します。Go 言語では、関数の基本構成は次のとおりです: キーワード func, Function名前、パラメータリスト、戻り値、関数本体、および return ステートメント すべてのプログラムには多くの関数が含まれており、関数は基本的なコード ブロックです。構文:
func 函数名(形参列表)(返回值类型列表) { 函数体,通常会有return语句,返回值 }
函数名(实参列表)
関数パラメーター
は、関数の呼び出し時に関数にデータを渡すために使用されます。実パラメータ、実パラメータ。呼び出し時に指定されるパラメータ。特定の実データを持つパラメータを指します。仮パラメータ、仮パラメータ。定義時に使用するパラメータ。これは、関数にはパラメータが必要ですが、パラメータの定義時には実際のデータが存在しないことを意味します。呼び出し時には、実際のパラメータを使用して仮パラメータ変数に値を割り当てるプロセスが発生します。これはパラメータの受け渡しと呼ばれます。関数の実行中、仮パラメータには特定のデータが含まれ、仮パラメータは関数内で宣言された変数と同等です。 パラメータ転送は、値転送とアドレス転送の 2 つの方法に分かれます。アドレスを渡す場合、仮パラメータをポインタ型として定義し、呼び出し時にアドレスパラメータを取得する必要があります。サンプル コード:func funcTest(p1 int, p2 *int) { p1++ *p2++ fmt.Println(p1, *p2) } func main() { var ( a1 = 42 a2 = 42 ) funcTest(a1, &a2) // 参数赋值过程 fmt.Println(a1, a2) }
43 43 42 43
定义: func funcTest(op string, nums ...int) { fmt.Println(nums) // [4, 1, 55, 12], slice切片型数据 } 调用 funcTest("someOp", 4, 1, 55, 12)
#関数の戻り値return ステートメントは、戻り値を生成するために使用されます。戻り値のタイプは関数の定義時に決定する必要があり、複数値の戻り値がサポートされています。デモ構文:
func funcTest() (int, string) { return 42, "Hank" }
定義時に返される変数を宣言できます。このメソッドは return という名前で、デモは次のとおりです。
func funcTest() (num int, title string) { num = 42 title = "Hank" return }
データを返す必要はなく、直接返すだけです。
関数変数関数は特別なポインタ型とみなすことができ、他の型と同様に変数に保存できます。関数には関数識別子と変数を介してアクセスできます。デモは次のとおりです:
func funcTest() { fmt.Println("func() type") } func main() { fmt.Printf("%T, (%v)\n", funcTest, funcTest) fn := funcTest fmt.Printf("%T, (%v)\n", fn, fn) funcTest() fn() }
実行結果:
func(), (0x48fe20) func(), (0x48fe20) func() type func() type
関数識別子が関数へのポインターであることがわかります。他の変数に代入できます。
関数パラメータ関数は、他の関数のパラメータとしても使用できます。デモは次のとおりです:
func funcSuccess() { } func funcAsync(handle func()) { // 调用函数参数 handle() } // 传递函数到其他函数 funcAsync(success)
この種のコールバック 関数の使用構文は、非同期ロジックを扱うときに非常に役立ちます。
#匿名関数匿名関数を定義できます。匿名関数は、変数に保存したり、引数として渡したり、すぐに呼び出したりすることができます。関数を一時的に使用する場合は、匿名関数を選択することをお勧めします。構文の例:
赋值给变量 fn := func() { } fn() // 作为参数 someFunc(func() { }) // 立即调用 func() { }()
由于匿名函数可以定义在其他函数内,同时变量的作用域为层叠的,也就是匿名函数可以会访问其所在的外层函数内的局部变量。当外层函数运行结束后,匿名函数会与其使用的外部函数的局部变量形成闭包。示例代码: 此例中,fn 对应的匿名函数与 outer() 的局部变量 v,就形成了闭包。 函数调用示意图 代码编译期间,会将函数代码存放在内存代码区。 函数被调用时,在运行期间会在函数运行栈区开辟函数栈,内部由局部变量标识符列表(就是局部变量),上层标识符列表引用等信息。直到运行结束,此空间才会被出栈,释放。 函数内部调用了新函数,新函数的执行空间入栈,要等到新函数执行空间出栈,调用他的函数才会被出栈。 以上代码的运行逻辑图如下: 递归调用 函数内部调用函数本身。称之为递归调用。示例代码: 定义实现递归调用函数时,通常需要定义一个出口。用来确定何时不再进行递归调用了。一旦满足条件,则调用停止。例如: 典型的应用有,树状菜单的处理,遍历目录,快速排序等。 递归调用的优势是编码简单,与描述的业务逻辑保持一致。 【相关推荐:Go视频教程】 以上がGo言語で関数とは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。var fn func()
func outer() {
v := 42
fn = func() {
v ++
fmt.Print(v)
}
}
outer()
fn() // 43
var v = "global"
func funcTest(v) {
v = "funcTest"
fmt.Println(v)
}
func main() {
v := "main"
funcTest(v)
}
func funcTest() {
fmt.Println("run")
funcTest()
}
func funcTest(v) {
fmt.Println(v, "run")
v ++
if v <= 10 {
funcTest()
}
}