序章

関数は、一度定義されると再利用できるコードのセクションです。 関数は、プログラム全体で複数回使用できる小さくて理解しやすいタスクにコードを分割することにより、コードを理解しやすくするために使用されます。

Goには、多くの定義済み関数を備えた強力な標準ライブラリが付属しています。 fmtパッケージですでにおなじみのものは次のとおりです。

  • fmt.Println()これは、オブジェクトを標準出力(おそらく端末)に出力します。
  • fmt.Printf()これにより、印刷出力をフォーマットできます。

関数名には括弧が含まれ、パラメーターが含まれる場合があります。

このチュートリアルでは、コーディングプロジェクトで使用する独自の関数を定義する方法について説明します。

関数の定義

クラシックな「Hello、World!」を回すことから始めましょう。 プログラムを関数に。

選択したテキストエディタで新しいテキストファイルを作成し、プログラムhello.goを呼び出します。 次に、関数を定義します。

関数は、funcキーワードを使用して定義されます。 次に、選択した名前と、関数が取るパラメーターを保持する括弧のセットが続きます(空の場合もあります)。 機能コードの行は中括弧{}で囲まれています。

この場合、hello()という名前の関数を定義します。

hello.go
func hello() {}

これにより、関数を作成するための最初のステートメントが設定されます。

ここから、関数の機能を説明する2行目を追加します。 この場合、Hello, World!をコンソールに出力します。

hello.go
func hello() {
	fmt.Println("Hello, World!")
}

これで関数は完全に定義されましたが、この時点でプログラムを実行すると、関数を呼び出さなかったため何も起こりません。

したがって、main()関数ブロック内で、hello()を使用して関数を呼び出しましょう。

hello.go
package main

import "fmt"

func main() {
	hello()
}

func hello() {
	fmt.Println("Hello, World!")
}

それでは、プログラムを実行してみましょう。

  1. go run hello.go

次の出力が表示されます。

Output
Hello, World!

main()という関数も導入されていることに注意してください。 main()関数は、プログラムがstartする必要がある場所であることをコンパイラーに通知する特別な関数です。 実行可能(コマンドラインから実行できるプログラム)にしたいプログラムには、main()関数が必要です。 main()関数は、1回だけ出現し、main() パッケージに含まれ、引数を受け取ったり返さなかったりする必要があります。 これにより、任意のGoプログラムでプログラム実行が可能になります。 次の例のように:

main.go
package main

import "fmt"

func main() {
	fmt.Println("this is the main section of the program")
}

関数は、定義したhello()関数よりも複雑になる可能性があります。 関数ブロック内でforループ条件文などを使用できます。

たとえば、次の関数は、条件ステートメントを使用してname変数の入力に母音が含まれているかどうかを確認し、forループを使用してnameの文字を反復処理します。 ] ストリング。

names.go
package main

import (
	"fmt"
	"strings"
)

func main() {
	names()
}

func names() {
	fmt.Println("Enter your name:")

	var name string
	fmt.Scanln(&name)
	// Check whether name has a vowel
	for _, v := range strings.ToLower(name) {
		if v == 'a' || v == 'e' || v == 'i' || v == 'o' || v == 'u' {
			fmt.Println("Your name contains a vowel.")
			return
		}
	}
	fmt.Println("Your name does not contain a vowel.")
}

ここで定義するnames()関数は、入力を使用してname変数を設定し、forループ内に条件ステートメントを設定します。 これは、関数定義内でコードを編成する方法を示しています。 ただし、プログラムの目的とコードの設定方法によっては、条件ステートメントとforループを2つの別個の関数として定義したい場合があります。

プログラム内で関数を定義すると、コードがモジュール化されて再利用可能になるため、同じ関数を書き直さずに呼び出すことができます。

パラメータの操作

これまで、引数を取らない空の括弧を持つ関数を見てきましたが、括弧内の関数定義でパラメーターを定義できます。

パラメータは、関数定義内の名前付きエンティティであり、関数が受け入れることができる引数を指定します。 Goでは、パラメータごとにデータ型を指定する必要があります。

指定した回数だけ単語を繰り返すプログラムを作ってみましょう。 単語を繰り返す回数は、wordというstringパラメータとrepsというintパラメータを取ります。

repeat.go
package main

import "fmt"

func main() {
	repeat("Sammy", 5)
}

func repeat(word string, reps int) {
	for i := 0; i < reps; i++ {
		fmt.Print(word)
	}
}

wordパラメーターに値Sammyを渡し、repsパラメーターに5を渡しました。 これらの値は、指定された順序で各パラメーターに対応します。 repeat関数には、repsパラメーターで指定された回数を繰り返すforループがあります。 反復ごとに、wordパラメーターの値が出力されます。

プログラムの出力は次のとおりです。

Output
SammySammySammySammySammy

すべて同じ値のパラメータのセットがある場合は、毎回タイプの指定を省略できます。 すべてintの値であるパラメーターxy、およびzを取り込む小さなプログラムを作成しましょう。 さまざまな構成でパラメーターを一緒に追加する関数を作成します。 これらの合計は、関数によって出力されます。 次に、関数を呼び出して、関数に番号を渡します。

add_numbers.go
package main

import "fmt"

func main() {
	addNumbers(1, 2, 3)
}

func addNumbers(x, y, z int) {
	a := x + y
	b := x + z
	c := y + z
	fmt.Println(a, b, c)
}

addNumbersの関数シグネチャを作成したとき、毎回タイプを指定する必要はありませんでしたが、最後にのみ指定しました。

xパラメータには1yパラメータには2zパラメータ。 これらの値は、指定された順序で各パラメーターに対応します。

プログラムは、パラメーターに渡した値に基づいて次の計算を実行します。

a = 1 + 2
b = 1 + 3
c = 2 + 3

この関数は、ab、およびcも出力します。この計算に基づいて、a3と等しいと予想されます。 、b4になり、c5になります。 プログラムを実行してみましょう:

  1. go run add_numbers.go
Output
3 4 5

12、および3をパラメーターとしてaddNumbers()関数に渡すと、期待どおりの出力が得られます。

パラメータは、通常、関数定義内の変数として定義される引数です。 メソッドを実行するときに値を割り当てて、引数を関数に渡すことができます。

値を返す

パラメータ値を関数に渡すことができ、関数は値を生成することもできます。

関数は、returnステートメントを使用して値を生成できます。これにより、関数が終了し、オプションで式が呼び出し元に返されます。 戻りデータ型も指定する必要があります。

これまで、関数でreturnステートメントの代わりにfmt.Println()ステートメントを使用してきました。 印刷する代わりに変数を返すプログラムを作成しましょう。

double.goという新しいテキストファイルで、パラメータxを2倍にし、変数yを返すプログラムを作成します。 result変数を出力する呼び出しを発行します。この変数は、3が渡されたdouble()関数を実行することによって形成されます。

double.go
package main

import "fmt"

func main() {
	result := double(3)
	fmt.Println(result)
}

func double(x int) int {
	y := x * 2
	return y
}

プログラムを実行して、出力を確認できます。

  1. go run double.go
Output
6

整数6が出力として返されます。これは、32を掛けた場合に予想されるものです。

関数がリターンを指定する場合は、コードの一部としてリターンを提供する必要があります。 そうしないと、コンパイルエラーが発生します。

returnステートメントを使用して行をコメント化することにより、これを示すことができます。

double.go
package main

import "fmt"

func main() {
	result := double(3)
	fmt.Println(result)
}

func double(x int) int {
	y := x * 2
	// return y
}

それでは、プログラムをもう一度実行してみましょう。

  1. go run double.go
Output
./double.go:13:1: missing return at end of function

ここでreturnステートメントを使用しないと、プログラムをコンパイルできません。

関数がreturnステートメントにヒットすると、関数の最後になくても、関数はすぐに終了します。

return_loop.go
package main

import "fmt"

func main() {
	loopFive()
}

func loopFive() {
	for i := 0; i < 25; i++ {
		fmt.Print(i)
		if i == 5 {
			// Stop function at i == 5
			return
		}
	}
	fmt.Println("This line will not execute.")
}

ここでは、forループを反復処理し、ループに25反復を実行するように指示します。 ただし、forループ内には、iの値が5と等しいかどうかを確認する条件付きifステートメントがあります。 そうである場合は、returnステートメントを発行します。 loopFive関数を使用しているため、関数の任意の時点でreturnを実行すると関数が終了します。 その結果、この関数の最後の行に到達してステートメントThis line will not execute.を出力することはありません。

forループ内でreturnステートメントを使用すると、関数が終了するため、ループの外側にある行は実行されません。 代わりに、 breakステートメントを使用した場合、その時点でループのみが終了し、最後のfmt.Println()行が実行されます。

returnステートメントは関数を終了し、関数のシグネチャで指定されている場合は値を返す場合があります。

複数の値を返す

1つの関数に複数の戻り値を指定できます。 repeat.goプログラムを調べて、2つの値を返すようにします。 repsパラメーターが0より大きい値でない場合、最初の値は繰り返し値になり、2番目の値はエラーになります。

repeat.go
package main

import "fmt"

func main() {
	val, err := repeat("Sammy", -1)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(val)
}

func repeat(word string, reps int) (string, error) {
	if reps <= 0 {
		return "", fmt.Errorf("invalid value of %d provided for reps. value must be greater than 0.", reps)
	}
	var value string
	for i := 0; i < reps; i++ {
		value = value + word
	}
	return value, nil
}

repeat関数が最初に行うことは、reps引数が有効な値であるかどうかを確認することです。 0以下の値はエラーの原因になります。 -1の値を渡したので、このコードブランチが実行されます。 関数から戻るときは、stringerrorの両方の戻り値を指定する必要があることに注意してください。 提供された引数でエラーが発生したため、最初の戻り値には空白の文字列を返し、2番目の戻り値にはエラーを返します。

main()関数では、valueerrの2つの新しい変数を宣言することにより、両方の戻り値を受け取ることができます。 返品時にエラーが発生する可能性があるため、プログラムを続行する前に、エラーが発生したかどうかを確認したいと思います。 この例では、エラーが発生しました。 エラーを出力し、main()関数からreturnを出力してプログラムを終了します。

エラーがなかった場合は、関数の戻り値を出力します。

注:2つまたは3つの値のみを返すことがベストプラクティスと見なされます。 さらに、関数からの最後の戻り値として常にすべてのエラーを返す必要があります。

プログラムを実行すると、次の出力が得られます。

Output
invalid value of -1 provided for reps. value must be greater than 0.

このセクションでは、returnステートメントを使用して関数から複数の値を返す方法を確認しました。

結論

関数は、プログラム内でアクションを実行する命令のコードブロックであり、コードを再利用可能でモジュール化するのに役立ちます。

コードをよりモジュール化する方法の詳細については、Goでパッケージを作成する方法に関するガイドを参照してください。