Menu
CoddyTech

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ỗ.

challenge icon

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à:

  1. Tạo một hàm có tên processNotification nhận một tham số interface{}
  2. 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ành float64 (biểu thị mức độ ưu tiên)
  3. Gọi hàm processNotification với giá trị đã chuyển đổi
  4. 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"

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(&notificationType)
	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
	
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Go online