Go の重要トピック

Sorting in Go: sort and slices

Sort numbers, strings and structs, and write your own order with a comparison function.

  • 中級
  • 約4分で読めます
  • 実行できるサンプル 1 件
学べること
  • sort.Ints
  • slices.SortFunc
  • sort.Slice for structs
Ranking
Leo95
Mia82
Zoe82
Ben67
Mia comes before Zoe because the scores are equal.

You decide the order

Go sorts slices in place. sort.Ints and sort.Strings cover the simple cases, and sort.Slice or slices.SortFunc take a function that decides the order.

slices.SortFunc compares two items and returns a negative number, zero or a positive number; comparing the lower-case forms ignores capital letters. sort.Slice takes a function that says whether item i comes before item j: here a higher score first, then the name.

重要なポイント

  1. Sorting changes the slice in place.
  2. sort.Slice takes a less function.
  3. Break ties with a second comparison.

実行できる Go のサンプル

Go
コードを実行 →
main.go
package main

import (
	"fmt"
	"slices"
	"sort"
	"strings"
)

type Student struct {
	Name  string
	Score int
}

func main() {
	numbers := []int{5, 2, 8, 1}
	sort.Ints(numbers)
	fmt.Println(numbers)

	words := []string{"pear", "Apple", "fig"}
	slices.SortFunc(words, func(a, b string) int {
		return strings.Compare(strings.ToLower(a), strings.ToLower(b))
	})
	fmt.Println(words)

	students := []Student{{"Mia", 82}, {"Leo", 95}, {"Zoe", 82}, {"Ben", 67}}
	sort.Slice(students, func(i, j int) bool {
		if students[i].Score != students[j].Score {
			return students[i].Score > students[j].Score
		}
		return students[i].Name < students[j].Name
	})
	for rank, student := range students {
		fmt.Printf("%d. %s (%d)\n", rank+1, student.Name, student.Score)
	}
}
この例の実行ボタンを作成 実行結果
[1 2 5 8]
[Apple fig pear]
1. Leo (95)
2. Mia (82)
3. Zoe (82)
4. Ben (67)

練習

サンプルをオンラインコンパイラーで開き、値を変えたり行を追加したりして、実行する前に出力を予想してみましょう。次に、わざとコードを壊してコンパイラーのメッセージを読んでみてください。

このレッスンを終えましたか?

学習済みにすると進み具合を記録できます。

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ