Goで関数を定義して呼び出す方法

前書き

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

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

  • `+ fmt.Println()+`は、オブジェクトを標準出力(ほとんどの場合、ターミナル)に出力します。

  • `+ fmt.Printf()+`を使用すると、印刷出力をフォーマットできます。

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

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

関数を定義する

古典的なhttps://www.digitalocean.com/community/tutorials/how-to-write-your-first-program-in-go[「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!")
}

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

go run hello.go

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

OutputHello, World!

+ main()+`という関数も導入したことに注意してください。 `+ main()+`関数は、プログラムが* start *すべき場所であることをコンパイラーに伝える特別な関数です。 executable(コマンドラインから実行できるプログラム)にしたいプログラムには、 `+ main()+`関数が必要です。 `+ main()+`関数は1回だけ出現し、 `+ main()+ _package_に含まれ、引数を受け取って返さない必要があります。 これにより、Goプログラムでhttps://golang.org/ref/spec#Program_execution[program execution]が可能になります。 次の例に従って:

main.go

package main

import "fmt"

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

関数は、定義した + hello()+`関数よりも複雑になる場合があります。 https://www.digitalocean.com/community/tutorials/how-to-construct-for-loops-in-go [+ for +` loops]、https://www.digitalocean.com/community/を使用できます。チュートリアル/ How-to-write-conditional-statements-in-go [条件付きステートメント]など、機能ブロック内。

たとえば、次の関数は条件文を使用して、変数「+ 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つの別個の関数として定義できます。

プログラム内で関数を定義すると、コードをモジュール化して再利用できるようになり、同じ関数を書き換えずに呼び出すことができます。

パラメータの使用

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

_parameter_は、関数が受け入れることができる引数を指定する、関数定義内の名前付きエンティティです。 Goでは、各パラメーターにhttps://www.digitalocean.com/community/tutorials/understanding-data-types-in-go[data type]を指定する必要があります。

単語を指定された回数繰り返すプログラムを作成しましょう。 単語を繰り返す回数は、「+ word n」と呼ばれる「+ 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 +`パラメーターの値が出力されます。

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

OutputSammySammySammySammySammy

すべて同じ値のパラメーターのセットがある場合は、毎回タイプを指定することを省略できます。 すべてが「+ int 」値であるパラメーター「 x 」、「 y 」、および「 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 」パラメータに「+1 +」、「 y 」パラメータに「+2 +」、「 z 」パラメータに「+3」を渡しました。 これらの値は、指定された順序で各パラメーターに対応します。

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

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

この関数は、「+ a 」、「 b 」、および「 c 」も出力します。この計算に基づいて、「 a 」は「+3 +」、「 b 」は「」 4 + 、および + c + + 5 + `にします。 プログラムを実行しましょう:

go run add_numbers.go
Output3 4 5

「+ addNumbers()」関数のパラメーターとして「+1 +」、「 2+」、および「3」を渡すと、期待される出力を受け取ります。

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

値を返す

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

関数は、 `+ 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
}

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

go run double.go
Output6

整数 `+ 6 `が出力として返されます。これは、 ` 3 `に ` 2 +`を掛けることで期待されるものです。

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

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
}

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

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 `ステートメントを発行します。 「 loop Five」関数にいるため、関数の任意の時点で「+ return」が関数を終了します。 その結果、この関数の最後の行に到達してステートメント「この行は実行されません。」を出力することはありません。

+ for`ループ内で + return`ステートメントを使用すると、関数が終了するため、ループ外の行は実行されません。 代わりに、https://www.digitalocean.com/community/tutorials/how-to-use-break-and-continue-statements-when-working-with-loops-in-go#break-を使用した場合statement [+ break + statement]、その時点でループのみが終了し、最後の `+ fmt.Println()+`行が実行されます。

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

複数の値を返す

関数には複数の戻り値を指定できます。 `+ 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 `の値を渡したため、このコードブランチが実行されます。 関数から戻るとき、 ` string `と ` error +`の両方の戻り値を提供する必要があることに注意してください。 指定された引数はエラーになったため、最初の戻り値には空の文字列を返し、2番目の戻り値にはエラーを返します。

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

エラーがなければ、関数の戻り値を出力します。

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

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

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

結論

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

コードをよりモジュール化する方法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-write-packages-in-go [Goでパッケージを記述する方法]のガイドを参照してください。 ]。