Go言語にはクラスがないので関数は非常に重要です。
Go言語の関数は第一級関数で、引数として渡せたり、戻り値として返せたりできます。
関数は大きく分けると2種類あります。
プログラム言語に初めから用意されている「組み込み関数」と、自分で作成する「ユーザー関数」です。
よく使うfmt.Println()は、fmtパッケージで初めから用意されている関数です。
ここでは後者の自分で作成する「ユーザー関数」について見ていきます。
関数とは
そもそも関数とは、プログラム内でよく使う処理をまとめたものです。
Go言語の場合main関数は最低限必要ですが、その中に何十行、何百行、何千行にも渡ってプログラムを書いていくことは可能です。しかし、そのようにプログラムを書くと、可読性が悪くなったり、メンテナンスが大変だったり、同じことを何回も書かねばならなかったりと効率が悪くなります。
関数の書き方
関数を定義するときは、funcキーワードを使用します。
引数も戻り値もない関数の場合
func 関数名() {
なんらかの処理
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import ( "fmt" ) //test1関数を定義 func test1() { fmt.Println("かきくけこ") } func main() { fmt.Println("あいうえお") test1() //test1関数を呼び出す } |
test1関数をmain関数の下に書いても問題ありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import ( "fmt" ) func main() { fmt.Println("あいうえお") test1() //test1関数を呼び出す } //test1関数を定義 func test1() { fmt.Println("かきくけこ") } |
引数がある関数の場合
引数とは「ひきすう」と読みます。関数に渡された値や変数のことを言います。
引数には仮引数と実引数があります。
func 関数名(仮引数 仮引数の型) {
なんらかの処理
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import ( "fmt" ) //test2関数を定義 func test2(a string) { //仮引数aを表示する fmt.Println(a) } func main() { fmt.Println("あいうえお") //test2関数に実引数”かきくけこ”を渡して呼び出す test2("かきくけこ") } |
複数の引数を渡すことも可能です。
func 関数名(仮引数 仮引数の型,仮引数 仮引数の型…) {
なんらかの処理
}
同じ型の引数なら下のように書くこともできます。
func 関数名(仮引数 ,仮引数 仮引数の型) {
なんらかの処理
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package main import ( "fmt" ) //test3関数を定義 func test3(a, b int) { //仮引数aとbを足す fmt.Println(a + b) } func main() { //test3関数に実引数1と2を渡して呼び出す test3(1, 2) } |
戻り値がある関数の場合
returnで返します。
func 関数名(仮引数 仮引数の型)戻り値の型 {
なんらかの処理
return 戻り値
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import ( "fmt" ) //関数を定義 func test4(a, b int) int { return a + b } func main() { //test4関数に実引数を入れて呼び出し、変数vに代入 v := test4(2, 5) fmt.Println(v) //7 } |
複数の戻り値も返せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "fmt" ) //関数を定義 func test5(a, b int) (int, int) { //aとbを逆にするだけ return b, a } func main() { //test5関数に実引数を入れて呼び出し、変数v1とv2に代入 v1, v2 := test5(2, 5) fmt.Println(v1, v2) //5 2 } |
戻り値に名前をつけると、returnだけで返却できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package main import ( "fmt" ) //関数を定義 func test6(a, b int) (c int) { //cを定義したことになるので:=ではない c = a + b return } func main() { //test6関数に実引数を入れて呼び出し、変数vに代入 v := test6(2, 5) fmt.Println(v) //7 } |
可変長引数
可変長引数を使うには…を書きます。
可変長引数はスライスになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package main import ( "fmt" ) //可変長引数 func sum(i ...int) { total := 0 for _, v := range i { total += v } fmt.Println(total) } func main() { //仮引数の型intを直接渡す場合 sum(1, 2) //3 sum(1, 2, 3) //6 //スライスで渡す場合...が必要 n := []int{1, 2, 3, 4} sum(n...) //10 } |