Type switch
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 18 trên 68.
Ép kiểu hữu ích khi kiểm tra một kiểu dữ liệu đơn lẻ, nhưng bạn thường cần xử lý nhiều kiểu dữ liệu có thể có của một biến interface. Lúc này, câu lệnh switch kiểu trở nên vô cùng hữu ích: nó giúp bạn thực hiện các hành động khác nhau tùy theo kiểu cụ thể.
Câu lệnh switch kiểu dùng cú pháp đặc biệt này: switch v := i.(type). Hãy chú ý từ khóa (type) thay vì một kiểu cụ thể. Biến v sẽ chứa giá trị thực tế với kiểu cụ thể của nó trong từng trường hợp:
func describe(data interface{}) {
switch v := data.(type) {
case int:
fmt.Printf("Integer: %d\n", v)
case string:
fmt.Printf("String: %s\n", v)
case bool:
fmt.Printf("Boolean: %t\n", v)
default:
fmt.Printf("Unknown type: %T\n", v)
}
}Trong mỗi trường hợp, v tự động có kiểu dữ liệu phù hợp, không cần ép kiểu thêm. Nhờ vậy, câu lệnh switch kiểu gọn gàng hơn nhiều so với việc nối nhiều phép ép kiểu bằng các câu lệnh if-else, nhất là khi bạn cần xử lý nhiều kiểu dữ liệu khác nhau tại cùng một chỗ.
Thử thách
DễTrong thử thách này, bạn sẽ luyện tập cách dùng switch kiểu để xử lý nhiều kiểu dữ liệu trong một hệ thống thông báo. Bạn sẽ tạo một hàm xử lý nhiều kiểu thông báo khác nhau và định dạng chúng phù hợp với kiểu cụ thể.
Bạn sẽ nhận được hai đầu vào:
- Một chuỗi biểu thị kiểu thông báo (ví dụ:
"email","sms","push"hoặc"alert") - Một chuỗi biểu thị nội dung hoặc giá trị của thông báo
Nhiệm vụ của bạn là:
- Tạo một hàm có tên
processNotificationnhận một tham sốinterface{} - Dựa trên đầu vào về kiểu thông báo, chuyển nội dung sang kiểu Go phù hợp và lưu vào một biến
interface{}:- Với
"email": dùng nội dung dưới dạng chuỗi - Với
"sms": chuyển nội dung thành số nguyên (biểu thị số lượng ký tự) - Với
"push": chuyển nội dung thành giá trị boolean (true với "enabled", false với mọi giá trị khác) - Với
"alert": chuyển nội dung thànhfloat64(biểu thị mức độ ưu tiên)
- Với
- Gọi hàm
processNotificationvới giá trị đã chuyển đổi - Bên trong
processNotification, dùng switch kiểu để xử lý từng kiểu và in ra thông báo phù hợp:- Với
string:"Email notification: [value]" - Với
int:"SMS notification with [value] characters" - Với
bool:"Push notifications: [value]" - Với
float64:"Alert with priority: [value]" - Với mọi kiểu khác:
"Unknown notification type"
- Với
Dùng gói strconv để chuyển đổi chuỗi. Khi chuyển đổi sang boolean, chỉ có "enabled" mới cho kết quả true. Thử thách này cho thấy switch kiểu là cách rõ ràng để xử lý nhiều kiểu trong cùng một cấu trúc điều khiển, đồng thời tự động cung cấp cho bạn giá trị đúng kiểu trong mỗi trường hợp.
In float64 ở dạng ngắn nhất, như cách fmt.Println hoặc các định dạng %v / %g thực hiện: 3.5 được in thành 3.5 và 1.0 thành 1 (định dạng %f sẽ in thành 1.000000).
Tự làm thử
package main
import (
"fmt"
"strconv"
)
func main() {
// Đọc đầu vào
var notificationType string
var content string
fmt.Scanln(¬ificationType)
fmt.Scanln(&content)
// TODO: Viết code bên dưới
// 1. Tạo hàm (function) processNotification nhận tham số (parameter) interface{}
// 2. Chuyển content sang kiểu dữ liệu phù hợp dựa trên notificationType
// 3. Gọi processNotification với giá trị đã chuyển đổi
// 4. Dùng type switch trong processNotification để xử lý các kiểu dữ liệu khác nhau
}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