ホームページ バックエンド開発 Golang Go言語で関数とは何を意味しますか?

Go言語で関数とは何を意味しますか?

Dec 08, 2022 pm 07:48 PM
go golang 言語を移動 関数

Go 言語では、関数とは、単一の特定の関数または関連する関数を実装するために使用される、整理された再利用可能なコード セグメント (ブロック) です。その主な目的は、アプリケーションのモジュール性とコードの効率を向上させることです。再利用、コード管理の改善、モジュール開発。関数は通常、パラメーターと戻り値を使用して呼び出し元と対話します。パラメーターはデータを関数に渡し、値を返し、関数は処理されたデータを呼び出し元に渡します。

Go言語で関数とは何を意味しますか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

関数は、単一関数または関連関数を実装するために使用される、整理された再利用可能なコード セグメントであり、アプリケーションのモジュール性とコードの再利用率を向上させることができます。

#関数の概要

関数、関数、特定の関数を実装するために使用される独立したコード ブロック。主な目的は、コードの再利用 (再利用)、コード管理の改善、モジュール開発です。関数は通常、パラメーターと戻り値を使用して呼び出し元と対話します。パラメーターは関数にデータを渡し、値を返し、関数は処理されたデータを呼び出し元に渡します。 Go 言語の関数は第一級市民と呼ばれます。これは、高階関数、匿名関数、クロージャなどの機能をサポートし、インターフェイスなどの高度な関数機能に対応できることを意味します。

関数定義

関数はコード実行の論理構造を構成します。Go 言語では、関数の基本構成は次のとおりです: キーワード func, Function名前、パラメータリスト、戻り値、関数本体、および return ステートメント すべてのプログラムには多くの関数が含まれており、関数は基本的なコード ブロックです。

構文:

  • 定義:

  • func 函数名(形参列表)(返回值类型列表) {
      函数体,通常会有return语句,返回值
    }
    ログイン後にコピー
  • 呼び出し:

  • 函数名(实参列表)
    ログイン後にコピー
関数名: 関数の識別子。関数を見つけるために使用され、内部的には関数コードを指すアドレスです。仮パラメータリスト:変数と型で構成されます 戻り値型リスト:関数の戻り値の型 戻り値は複数指定する必要があります。関数本体: 関数を実装する特定のステートメント。 return ステートメント: return value ステートメント

上記は名前付き関数であり、他の関数内で定義することはできません。

関数パラメーター

は、関数の呼び出し時に関数にデータを渡すために使用されます。実パラメータ、実パラメータ。呼び出し時に指定されるパラメータ。特定の実データを持つパラメータを指します。仮パラメータ、仮パラメータ。定義時に使用するパラメータ。これは、関数にはパラメータが必要ですが、パラメータの定義時には実際のデータが存在しないことを意味します。呼び出し時には、実際のパラメータを使用して仮パラメータ変数に値を割り当てるプロセスが発生します。これはパラメータの受け渡しと呼ばれます。関数の実行中、仮パラメータには特定のデータが含まれ、仮パラメータは関数内で宣言された変数と同等です。

パラメータ転送は、値転送とアドレス転送の 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
ログイン後にコピー

を出力し、値を渡すと、関数は実際のパラメーターのコピーを取得します。アドレスが渡されると、関数は実際のパラメータのアドレスを取得するため、関数内のアドレスによる変数の変更は実際のパラメータにも影響します。

Go は、rest...無限数のパラメータをサポートします。定義するときは、無限数の仮パラメータを仮パラメータ リストの最後に配置し、...Type メソッドを使用します。デモンストレーション:

定义:
func funcTest(op string, nums ...int) {
  fmt.Println(nums) // [4, 1, 55, 12], slice切片型数据
}
调用
funcTest("someOp", 4, 1, 55, 12)
ログイン後にコピー

Receive 受信したパラメータはスライスタイプです。

#関数の戻り値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() {
  }()
ログイン後にコピー

クロージャ

由于匿名函数可以定义在其他函数内,同时变量的作用域为层叠的,也就是匿名函数可以会访问其所在的外层函数内的局部变量。当外层函数运行结束后,匿名函数会与其使用的外部函数的局部变量形成闭包。示例代码:

var fn func()
func outer() {
  v := 42
  fn = func() {
    v ++
    fmt.Print(v)
  }
}

outer()
fn() // 43
ログイン後にコピー

此例中,fn 对应的匿名函数与 outer() 的局部变量 v,就形成了闭包。

函数调用示意图

var v = "global"
func funcTest(v) {
  v = "funcTest"
  fmt.Println(v)
}
func main() {
  v := "main"
  funcTest(v)
}
ログイン後にコピー

代码编译期间,会将函数代码存放在内存代码区。 函数被调用时,在运行期间会在函数运行栈区开辟函数栈,内部由局部变量标识符列表(就是局部变量),上层标识符列表引用等信息。直到运行结束,此空间才会被出栈,释放。 函数内部调用了新函数,新函数的执行空间入栈,要等到新函数执行空间出栈,调用他的函数才会被出栈。 以上代码的运行逻辑图如下:

Go言語で関数とは何を意味しますか?

递归调用

函数内部调用函数本身。称之为递归调用。示例代码:

func funcTest() {
  fmt.Println("run")
  funcTest()
}
ログイン後にコピー

定义实现递归调用函数时,通常需要定义一个出口。用来确定何时不再进行递归调用了。一旦满足条件,则调用停止。例如:

func funcTest(v) {
  fmt.Println(v, "run")
  v ++
  if v <= 10 {
    funcTest()
  }
}
ログイン後にコピー

典型的应用有,树状菜单的处理,遍历目录,快速排序等。 递归调用的优势是编码简单,与描述的业务逻辑保持一致。

【相关推荐:Go视频教程

以上がGo言語で関数とは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

マルチプロセスログを作成するときに、同時性が安全で効率的であることを確認する方法は? マルチプロセスログを作成するときに、同時性が安全で効率的であることを確認する方法は? Apr 02, 2025 pm 03:51 PM

マルチプロセスのログライティングの並行性セキュリティの問題を効率的に処理します。複数のプロセスが同じログファイルを同時に書き込みます。並行性が安全で効率的であることを確認する方法は?これは...

See all articles