関数
関数は一連の処理をまとめ、名前をつけたもの。
main()
関数やfmt.Println()
関数はそれぞれ特別な用途の関数。
main()
はプログラムのエントリーポイント、fmt.Println()
は標準出力への出力を行う。
標準ライブラリや外部ライブラリの関数を使用し、自分自身の関数や型を作成することができる。
関数の定義
関数は引数と返り値を持つことができる
func calc(x, y int) int {
return x + y
}
サンプルコード
package main
import (
"fmt"
"math/rand"
"time"
)
func calc(x, y int) int {
return x + y
}
func main() {
rand.Seed(time.Now().UnixNano())
x := rand.Intn(5)
y := rand.Intn(5)
fmt.Println(calc(x, y))
}
返り値に名前をつける
返り値用の変数を事前に定義することで、その変数に値を代入して返すことができる
func calcAge(y int, m time.Month, d int) (age int, err error) {
// 処理
}
サンプルコード
package main
import (
"fmt"
"time"
)
func calcAge(y int, m time.Month, d int) (age int, err error) {
currentYear, currentMonth, currentDay := time.Now().Date()
if currentYear < y || (currentYear == y && currentMonth < m) || (currentYear == y && currentMonth == m && currentDay < d) {
return 0, fmt.Errorf("指定された日付は未来の日付です")
}
age = currentYear - y
if currentMonth < m || (currentMonth == m && currentDay < d) {
age--
}
return age, nil
}
func main() {
year := 1990
month := time.January
day := 1
age, err := calcAge(year, month, day)
if err != nil {
fmt.Println("エラー:", err)
} else {
fmt.Println("年齢:", age) // 年齢: 33
}
}
無名関数
コールバック関数として使用するときに便利
package main
import "fmt"
func doCalc(a, b int, fn func(int, int) int) int {
result := fn(a, b)
return result
}
func main() {
m := func(x, y int) int {
return x * y
}
result := doCalc(10, 20, m)
fmt.Println(result) //200
}
エラー処理
Go言語におけるエラー処理は、例外ベースのアプローチではなく、値としてエラーを扱う。
失敗する可能性のある関数において返り値の末尾をerr(error
型)として定義して、関数を呼び出すときはerr
がnil
か否かを比較する。
エラーの返し方
func doSomething() (int, error) {
// エラーが発生した場合
if somethingWrong {
return 0, errors.New("エラーが発生しました")
}
// 成功した場合
return result, nil
}
エラーのチェック
result, err := doSomething()
if err != nil {
// エラー処理
fmt.Println("エラー発生:", err)
return
}
// エラーがない場合の処理
fmt.Println("結果:", result)
参考