Go言語の関数
関数は、タスクを実行するための基本的なコードブロックです。
Go言語には最低でも main() 関数があります。
関数を使用して機能を分割でき、論理的には各関数が指定されたタスクを実行します。
関数宣言はコンパイラに関数名、戻り値の型、およびパラメータを伝えます。
Go言語の標準ライブラリには、さまざまな組み込み関数が用意されています。例えば、len() 関数は異なる型の引数を受け取り、その型の長さを返します。文字列を渡した場合は文字列の長さを返し、配列を渡した場合は配列に含まれる要素の数を返します。
関数定義
Go言語の関数定義の形式は次のとおりです:
func function_name( [parameter list] ) [return_types] {
函数体
}
関数定義の説明:
- func:関数は func で宣言が始まります
- function_name:関数名。パラメータリストと戻り値の型が関数シグネチャを構成します。
- parameter list:パラメータリスト。パラメータはプレースホルダーのようなもので、関数が呼び出されるときに値をパラメータに渡すことができます。この値を実引数と呼びます。パラメータリストは、パラメータの型、順序、および数を指定します。パラメータはオプションであり、つまり関数はパラメータを含まないこともできます。
- return_types:戻り値の型。関数は一連の値を返します。return_types はその値のデータ型です。一部の関数は戻り値を必要としないため、その場合 return_types は必須ではありません。
- 関数本体:関数定義のコードの集まりです。
実例
以下の実例は max() 関数のコードです。この関数は2つの整数型パラメータ num1 と num2 を受け取り、これら2つのパラメータの最大値を返します:
実例
/* 関数は2つの数値の最大値を返す */
func max(num1, num2 int) int {
/* ローカル変数の宣言 */
var result int
if (num1 > num2) {
result = num1
} else {
result = num2
}
return result
}
func max(num1, num2 int) int {
/* ローカル変数の宣言 */
var result int
if (num1 > num2) {
result = num1
} else {
result = num2
}
return result
}
関数呼び出し
関数を作成するとき、関数が何を行うかを定義します。指定されたタスクを実行するには、その関数を呼び出します。
関数を呼び出し、関数にパラメータを渡し、戻り値を返します。例:
実例
package main
import "fmt"
func main() {
/* ローカル変数の定義 */
var a int = 100
var b int = 200
var ret int
/* 関数を呼び出して最大値を返す */
ret = max(a, b)
fmt.Printf( "最大値は : %d\n", ret )
}
/* 関数は2つの数値の最大値を返す */
func max(num1, num2 int) int {
/* ローカル変数の定義 */
var result int
if (num1 > num2) {
result = num1
} else {
result = num2
}
return result
}
import "fmt"
func main() {
/* ローカル変数の定義 */
var a int = 100
var b int = 200
var ret int
/* 関数を呼び出して最大値を返す */
ret = max(a, b)
fmt.Printf( "最大値は : %d\n", ret )
}
/* 関数は2つの数値の最大値を返す */
func max(num1, num2 int) int {
/* ローカル変数の定義 */
var result int
if (num1 > num2) {
result = num1
} else {
result = num2
}
return result
}
上記の実例では、main() 関数内で max() 関数を呼び出しており、実行結果は次のとおりです:
最大值是 : 200
関数が複数の値を返す
Goの関数は複数の値を返すことができます。例:
実例
package main
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("Google", "サンプル")
fmt.Println(a, b)
}
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("Google", "サンプル")
fmt.Println(a, b)
}
上記の実例の実行結果は次のとおりです:
サンプル Google
関数パラメータ
関数がパラメータを使用する場合、その変数は関数の仮パラメータ(仮引数)と呼ばれます。
仮パラメータは、関数本体内で定義されたローカル変数のようなものです。
関数を呼び出すとき、パラメータを渡す方法は2つあります:
| 渡し方の種類 | 説明 |
|---|---|
| 値渡し | 値渡しとは、関数を呼び出すときに実引数のコピーを関数に渡すことです。この場合、関数内でパラメータを変更しても、実引数には影響しません。 |
| 参照渡し | 参照渡しとは、関数を呼び出すときに実引数のアドレスを関数に渡すことです。この場合、関数内でパラメータに行った変更は実引数に影響します。 |
デフォルトでは、Go言語は値渡しを使用します。つまり、呼び出しの過程で実引数に影響を与えません。
関数の使い方
| 関数の使い方 | 説明 |
|---|---|
| 関数を別の関数の実引数として使用する | 関数は定義後、別の関数の実引数として渡すことができます |
| クロージャ | クロージャは匿名関数であり、動的プログラミングで使用できます |
| メソッド | メソッドとは、レシーバーを含む関数です |