本文へスキップ
BecomeCoder

Goコース · 第7章 パッケージと標準ライブラリ · レッスン28

sort と時間の扱い ― データを整える

ブラウザで完結

導入

集計結果を見やすい順に並べ替えたい、といった場面は非常に多くあります。sort パッケージは、スライスを並べ替えるための標準ライブラリです。あわせて、実務で頻出する「時間」の考え方にも触れておきます。

説明

package main

import (
	"fmt"
	"sort"
)

func main() {
	scores := []int{72, 95, 60, 88, 45}
	sort.Ints(scores)
	fmt.Println(scores)

	names := []string{"鈴木", "田中", "佐藤"}
	sort.Strings(names)
	fmt.Println(names)
}
  • sort.Ints(スライス)[]int昇順に並べ替える(スライスそのものを書き換える。戻り値はない)。
  • sort.Strings(スライス)[]string を辞書順に並べ替える。
  • 小数のスライスには sort.Float64s を使います。

降順にしたいときは、並べ替えたあとにスライスを逆順に読むか、比較条件を工夫した独自の並べ替え(sort.Slice)を使いますが、まずは「型ごとに専用の関数がある」という基本形を覚えておけば十分です。

続いて、時間の扱いです。Go では期間(デュレーション)を time.Secondtime.Millisecond のような単位の掛け算で表します。

package main

import (
	"fmt"
	"time"
)

func main() {
	d := 3 * time.Second
	fmt.Println(d/time.Second, "秒")

	time.Sleep(100 * time.Millisecond) // 100ミリ秒だけ処理を止める
	fmt.Println("待った後")
}
  • 3 * time.Second … 「3秒」というデュレーションの値。単位となる定数を掛けて表現します。
  • time.Sleep(...) … その場で処理を一時停止する。ネットワーク越しの再試行を少し待つ、といった場面で使います。

「何秒後」「何ミリ秒待つ」という時間の表現は、time.Secondtime.Millisecond を単位として掛け算で作る――これが Go の時間の書き方の基本です。

やってみよう

scores の中身を色々変えて sort.Ints の結果を確かめましょう。並べ替えは元のスライスを直接書き換える(新しいスライスを作らない)ことにも注目してください。

演習

temps := []float64{22.5, 19.8, 25.1, 18.3} というスライスを sort.Float64s で昇順に並べ替え、fmt.Println で表示してください。

ヒント1を見る

sort.Float64s(temps) はスライス自体を並べ替えます。戻り値を受け取る必要はありません。

ヒント2を見る

並べ替えたあとに fmt.Println(temps) を呼べば、そのまま [18.3 19.8 22.5 25.1] の形で表示されます。

実際に動かしてみよう

下のエディタにGoを書いて「実行」を押すと、学習用シミュレータが fmt の出力を表示します(本物のGoコンパイラではなく、教材の範囲を再現した軽量エンジンです)。スライス・マップ・構造体・インターフェース・goroutine/channel なども動きます。本文の例を書き換えて動かしてみましょう(並行処理の実行順は決定的に再現しているため、本物のインターリーブとは異なる場合があります)。

Go — ブラウザ内で実行(学習用シミュレータ)

Goの教材サブセットを動かす学習用シミュレータを読み込みます(本物のGoコンパイラではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。