[Goのはじめ方] Part17: 標準パッケージの活用(fmt, math, timeなど)

Goの標準ライブラリには便利なパッケージがたくさん!代表的なものを使いこなそう。

Go言語の大きな特徴の一つは、充実した標準パッケージ群です。これらを活用することで、外部ライブラリに頼らずとも多くの一般的なタスクを効率的に実装できます。ここでは、特によく使われる fmt, math, time パッケージを中心に使い方を見ていきましょう。

fmt パッケージ: フォーマットされた入出力

fmt パッケージは、データの表示や入力の読み取りなど、フォーマットされたI/O操作を行うための基本的な関数を提供します。デバッグ出力やユーザーへのメッセージ表示など、非常によく使われます。

主な関数:

  • fmt.Println(...): 引数を標準出力に出力し、最後に改行を追加します。複数の引数を渡すとスペース区切りで出力されます。
  • fmt.Printf(format string, ...): フォーマット文字列に従って、引数を整形して標準出力に出力します。C言語の printf に似ています。
  • fmt.Sprintf(format string, ...): Printf と同様ですが、結果を文字列として返します(出力はしません)。
  • fmt.Scanln(...): 標準入力からスペース区切りの値を読み取り、引数に指定した変数に格納します。改行で入力完了となります。

コード例:

package main

import "fmt"

func main() {
	name := "Go Beginner"
	age := 1

	// Println の例
	fmt.Println("Hello,", name, "!") // Hello, Go Beginner !
	fmt.Println("Age:", age)         // Age: 1

	// Printf の例 (書式指定子 %s: 文字列, %d: 整数)
	fmt.Printf("名前: %s, 年齢: %d歳\n", name, age) // 名前: Go Beginner, 年齢: 1歳

	// Sprintf の例
	message := fmt.Sprintf("%s は %d 歳です。", name, age)
	fmt.Println(message) // Go Beginner は 1 歳です。

	// Scanln の例 (コメントアウトを外して試す)
	// var inputName string
	// var inputAge int
	// fmt.Println("名前と年齢を入力してください(スペース区切り):")
	// fmt.Scanln(&inputName, &inputAge)
	// fmt.Printf("入力された名前: %s, 年齢: %d\n", inputName, inputAge)
}

Printf で使える書式指定子には様々なものがあります (%v: デフォルトフォーマット, %T: 型情報, %f: 浮動小数点数など)。詳細は公式ドキュメントを参照してください。

fmt パッケージドキュメント

math パッケージ: 数学関数

math パッケージは、基本的な数学定数(円周率 π など)や数学関数(平方根、累乗、三角関数など)を提供します。数値計算が必要な場合に役立ちます。

主な定数と関数:

  • math.Pi: 円周率 π の値。
  • math.Sqrt(x float64) float64: x の平方根を返します。
  • math.Pow(x, y float64) float64: x の y 乗を返します。
  • math.Max(x, y float64) float64: x と y のうち大きい方を返します。
  • math.Min(x, y float64) float64: x と y のうち小さい方を返します。
  • math.Abs(x float64) float64: x の絶対値を返します。
  • math.Floor(x float64) float64: x 以下の最大の整数値を返します(切り捨て)。
  • math.Ceil(x float64) float64: x 以上の最小の整数値を返します(切り上げ)。
  • 三角関数 (math.Sin, math.Cos, math.Tan など)

注意: math パッケージの関数の多くは float64 型を引数にとり、float64 型を返します。整数型で計算したい場合は型変換が必要になることがあります。

コード例:

package main

import (
	"fmt"
	"math"
)

func main() {
	radius := 5.0
	area := math.Pi * math.Pow(radius, 2) // 円の面積 π * r^2
	fmt.Printf("半径 %.1f の円の面積: %.2f\n", radius, area) // 半径 5.0 の円の面積: 78.54

	num := 64.0
	sqrtNum := math.Sqrt(num)
	fmt.Printf("%.0f の平方根: %.1f\n", num, sqrtNum) // 64 の平方根: 8.0

	fmt.Println("最大値:", math.Max(10.5, 20.1)) // 最大値: 20.1
	fmt.Println("最小値:", math.Min(-5, -10))  // 最小値: -10
	fmt.Println("切り捨て:", math.Floor(3.14))  // 切り捨て: 3
	fmt.Println("切り上げ:", math.Ceil(3.14))   // 切り上げ: 4
}

乱数が必要な場合は、math/rand パッケージを使用します。

math パッケージドキュメント

time パッケージ: 時刻の扱い

time パッケージは、現在時刻の取得、時刻の生成、時刻のフォーマット、タイマー、スリープなど、時間に関する様々な機能を提供します。

主な型と関数:

  • time.Time: 特定の瞬間を表す型。
  • time.Now() Time: 現在のローカル時刻を取得します。
  • time.Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time: 指定した要素から time.Time オブジェクトを生成します。
  • (t Time) Format(layout string) string: Time オブジェクトを指定したレイアウト文字列に従ってフォーマットします。Go特有のレイアウト"2006-01-02 15:04:05" を基準に指定します。
  • time.Parse(layout, value string) (Time, error): 文字列を指定したレイアウトで解析し、time.Time オブジェクトに変換します。
  • time.Sleep(d Duration): 指定した期間(time.Duration 型)だけ現在のGoroutineを停止させます。
  • time.Second, time.Minute, time.Hour など: time.Duration 型の定数。

フォーマットレイアウトについて:

Goの時刻フォーマットは特殊で、基準となる時刻 Mon Jan 2 15:04:05 MST 2006 の各要素を使ってレイアウトを指定します。

要素レイアウト文字
2006 or 06"2006年", "06/01/02"
Jan, January, 01, 1"2006-01", "Jan 2"
2, 02, _2"01/02", "Jan _2"
時 (24時間)15"15:04"
時 (12時間)3, 03"3:04 PM"
4, 04"15:04"
5, 05"15:04:05"
タイムゾーンMST, -0700, Z0700"2006-01-02 15:04:05 MST"

コード例:

package main

import (
	"fmt"
	"time"
)

func main() {
	// 現在時刻の取得
	now := time.Now()
	fmt.Println("現在時刻:", now) // 例: 2025-03-31 14:59:00.1234567 +0000 UTC m=+0.000000001

	// フォーマット (Go特有のレイアウト文字列)
	fmt.Println("フォーマット (YYYY-MM-DD HH:mm:ss):", now.Format("2006-01-02 15:04:05"))
	fmt.Println("フォーマット (和暦風):", now.Format("2006年01月02日 15時04分05秒"))
	fmt.Println("フォーマット (日付のみ):", now.Format("2006/01/02"))

	// 文字列から時刻へパース
	layout := "2006-01-02 15:04"
	timeStr := "2023-10-26 10:30"
	parsedTime, err := time.Parse(layout, timeStr)
	if err != nil {
		fmt.Println("パースエラー:", err)
	} else {
		fmt.Println("パース結果:", parsedTime)
	}

	// 特定の日時を生成 (タイムゾーンは UTC)
	specificTime := time.Date(2024, time.April, 1, 12, 0, 0, 0, time.UTC)
	fmt.Println("特定の日時:", specificTime)

	// スリープ
	fmt.Println("処理を開始します...")
	time.Sleep(2 * time.Second) // 2秒待機
	fmt.Println("2秒経過しました。")
}

time パッケージドキュメント

その他の便利な標準パッケージ

fmt, math, time 以外にも、Goには多くの便利な標準パッケージがあります。いくつか代表的なものを紹介します。
  • os: ファイル操作(作成、読み書き、削除)、環境変数へのアクセス、プロセスの実行など、オペレーティングシステムに関連する機能を提供します。
    os ドキュメント
  • strings: 文字列の検索、置換、分割、結合、大文字/小文字変換など、文字列操作に関する豊富な関数を提供します。
    strings ドキュメント
  • strconv: 文字列と数値(整数、浮動小数点数、真偽値など)間の変換を行います (Atoi: 文字列->int, Itoa: int->文字列 など)。
    strconv ドキュメント
  • encoding/json: Goのデータ構造(構造体、マップなど)とJSON形式との間でエンコード(Go→JSON)およびデコード(JSON→Go)を行います。
    encoding/json ドキュメント
  • net/http: HTTPクライアント(Web APIへのリクエスト送信)やHTTPサーバー(Webアプリケーションの構築)を実装するための機能を提供します。
    net/http ドキュメント
  • io / io/ioutil (非推奨、osやioへ移行): 入出力操作に関する基本的なインターフェース(io.Reader, io.Writer)や、ファイル全体を読み込むなどの便利なユーティリティ関数を提供します。(ioutil.ReadFileなどはos.ReadFileを使うことが推奨されています)
    io ドキュメント

これらのパッケージは、Goで開発を行う上で非常に頻繁に使用されます。必要に応じて公式ドキュメントを参照し、使い方をマスターしましょう。

標準パッケージを使いこなすことが、効率的で安定したGoプログラムを書くための第一歩です!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です