0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go 言語を学ぶAdvent Calendar 2023

Day 9

【Go言語】関数・エラー処理

Last updated at Posted at 2023-12-08

関数

関数は一連の処理をまとめ、名前をつけたもの。

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型)として定義して、関数を呼び出すときはerrnilか否かを比較する。

エラーの返し方

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)

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?