Chủ đề Go quan trọng

Sorting in Go: sort and slices

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

  • Trung cấp
  • Đọc trong 4 phút
  • 1 ví dụ chạy được
Bạn sẽ học được gì
  • 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.

Những điểm quan trọng

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

Ví dụ Go chạy được

Go
Chạy code →
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)
	}
}
Lấy nút Run cho ví dụ này Kết quả khi chạy
[1 2 5 8]
[Apple fig pear]
1. Leo (95)
2. Mia (82)
3. Zoe (82)
4. Ben (67)

Luyện tập

Mở ví dụ trong trình biên dịch online, đổi một giá trị hoặc thêm một dòng, rồi đoán kết quả trước khi chạy. Sau đó cố ý làm code bị lỗi và đọc thông báo của trình biên dịch.

Bạn học xong bài này chưa?

Đánh dấu đã học để theo dõi tiến độ của bạn.

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách