Map chứa struct
Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 26 trên 68.
Map trở nên vô cùng hữu ích khi bạn lưu struct làm giá trị. Cách này giúp bạn sắp xếp dữ liệu có cấu trúc phức tạp bằng các khóa có ý nghĩa, giúp tra cứu và truy xuất dễ dàng.
Khi dùng struct làm giá trị trong map, về cơ bản bạn đang tạo một tập hợp trong đó mỗi khóa trỏ đến một bản ghi dữ liệu hoàn chỉnh. Sau đây là cách khai báo và khởi tạo map như vậy:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Bạn có thể truy cập và thao tác với dữ liệu struct thông qua map giống như với bất kỳ thao tác map nào khác. Để lấy thông tin của một học sinh, bạn chỉ cần dùng tên của bạn ấy làm khóa:
alice := students["Alice"]
fmt.Println(alice.ID) // in ra: 101
fmt.Println(alice.Grade) // in ra: AMẫu này rất phổ biến trong các ứng dụng Go để lưu trữ tập hợp dữ liệu có liên quan, chẳng hạn như hồ sơ người dùng, danh mục sản phẩm hoặc cài đặt cấu hình, khi bạn cần cả dữ liệu có cấu trúc lẫn khả năng truy cập nhanh dựa trên khóa.
Thử thách
DễTạo hệ thống quản lý điểm của học sinh bằng map với struct làm giá trị. Thử thách này hướng dẫn cách sắp xếp dữ liệu học sinh phức tạp bằng các khóa có ý nghĩa để tra cứu và truy xuất hiệu quả.
Bạn sẽ nhận được hai đầu vào:
- Một chuỗi biểu thị số lượng học sinh (ví dụ:
"4") - Một chuỗi chứa dữ liệu học sinh theo định dạng:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(ví dụ:"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
Nhiệm vụ của bạn là:
- Định nghĩa struct
Studentvới các trường sau:ID(int), mã số của học sinhGrade(string), xếp loại chữ của học sinh
- Tạo map trong đó khóa là tên học sinh (chuỗi) và giá trị là các struct
Student - Phân tích dữ liệu học sinh từ đầu vào thứ hai:
- Tách đầu vào theo dấu phẩy để lấy từng mục dữ liệu học sinh
- Với mỗi mục, tách theo dấu hai chấm để phân biệt tên, mã số và xếp loại
- Chuyển chuỗi mã số thành số nguyên
- Tạo struct
Studentvà thêm vào map với tên làm khóa
- Hiển thị tất cả học sinh theo thứ tự bảng chữ cái của tên, theo định dạng:
"[name]: ID [id], Grade [grade]" - Tính toán và hiển thị thống kê xếp loại:
- Đếm số học sinh đạt từng xếp loại (A, B, C, D, F)
- Hiển thị số lượng của mỗi xếp loại xuất hiện theo định dạng:
"Grade [grade]: [count] students" - Hiển thị các xếp loại theo thứ tự bảng chữ cái (A, B, C, D, F)
- Tìm và hiển thị học sinh có mã số cao nhất theo định dạng:
"Highest ID: [name] ([id])" - Hiển thị tổng số học sinh:
"Total students: [count]"
Dùng package strconv để chuyển chuỗi mã số thành số nguyên và package sort để sắp xếp tên học sinh theo thứ tự bảng chữ cái. Thử thách này hướng dẫn cách map với các giá trị struct giúp sắp xếp và truy cập hiệu quả những tập hợp dữ liệu phức tạp bằng các mã định danh có ý nghĩa.
Tự làm thử
package main
import (
"fmt"
)
func main() {
// Đọc đầu vào
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: Định nghĩa struct Student ở đây
// TODO: Tạo map để lưu sinh viên (tên làm khóa, struct Student làm giá trị)
// TODO: Phân tích dữ liệu sinh viên và đưa vào map
// TODO: Hiển thị tất cả sinh viên theo thứ tự bảng chữ cái của tên
// TODO: Tính và hiển thị thống kê điểm
// TODO: Tìm và hiển thị sinh viên có ID lớn nhất
// TODO: Hiển thị tổng số sinh viên
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Luồng điều khiển nâng cao
Switch với `fallthrough`Thoát khỏi vòng lặp lồng nhauTiếp tục một vòng lặp cụ thểCâu lệnh `goto`Ôn tập: điều khiển vòng lặp nâng cao4Dự án: Danh sách việc cần làm đơn giản
Thiết lập dự ánThêm một việc cần làm2Struct và phương thức
Định nghĩa phương thức cho structReceiver giá trịReceiver con trỏChọn receiverPhương thức và hàmÔn tập: hành vi của struct5Tìm hiểu chuyên sâu về map
Map chứa structCon trỏ làm giá trị của mapKiểm tra map nilSo sánh các mapÔn tập: bộ đếm tần suất từ8Dự án: Quản lý hàng tồn kho đơn giản
Tổng quan dự ánKiểm tra hàng tồn kho3Interface (cơ bản)
Interface là gì?Định nghĩa interfaceTriển khai interfaceDùng kiểu interfaceInterface rỗngKhẳng định kiểuType switchÔn tập: hình dạng và hành viTự luyện tập: Trình biên dịch Go online