Menu
CoddyTech

Khẳng định kiểu

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 17 trên 68.

Khi làm việc với các biến giao diện, bạn thường cần truy cập giá trị cụ thể thực sự được lưu bên trong chúng. Đây là lúc ép kiểu phát huy tác dụng, giúp bạn trích xuất và sử dụng giá trị bên dưới một cách an toàn.

Phép khẳng định kiểu dùng cú pháp này: value, ok := interfaceVariable.(Type). Giá trị trả về đầu tiên là giá trị đã trích xuất thuộc kiểu được chỉ định, còn giá trị trả về thứ hai là một giá trị boolean cho bạn biết phép khẳng định có thành công hay không.

var data interface{} = 42

number, ok := data.(int)
if ok {
    fmt.Println("It's an integer:", number)
} else {
    fmt.Println("Not an integer")
}

Biến ok rất quan trọng để đảm bảo an toàn. Nếu bạn thử xác nhận sai kiểu, ok sẽ là false, còn value sẽ là giá trị không của kiểu đó. Nếu không kiểm tra ok, việc xác nhận kiểu thất bại sẽ khiến chương trình của bạn gặp lỗi panic.

Ép kiểu là điều cần thiết khi làm việc với các giá trị interface{}, giúp bạn chuyển interface tổng quát về kiểu cụ thể để sử dụng các phương thức và phép toán của kiểu đó.

challenge icon

Thử thách

Dễ

Trong thử thách này, bạn sẽ luyện cách dùng phép xác nhận kiểu (type assertion) để lấy và sử dụng an toàn các giá trị cụ thể từ biến interface. Bạn sẽ tạo một trình phân tích dữ liệu để xử lý nhiều kiểu giá trị được lưu trong interface rỗng.

Bạn sẽ nhận hai đầu vào:

  • Một chuỗi biểu thị kiểu dữ liệu cần kiểm tra (ví dụ: "int", "string" hoặc "bool")
  • Một chuỗi biểu thị giá trị thực tế (ví dụ: "42", "hello" hoặc "true")

Nhiệm vụ của bạn là:

  1. Chuyển chuỗi giá trị sang kiểu Go phù hợp và lưu vào một biến interface{}:
    • Với "int": chuyển sang số nguyên
    • Với "string": dùng làm chuỗi
    • Với "bool": chuyển sang giá trị boolean
  2. Dùng phép xác nhận kiểu để kiểm tra xem biến interface có chứa kiểu dữ liệu được chỉ định trong đầu vào thứ nhất hay không
  3. Nếu phép xác nhận kiểu thành công, in ra: "Success: [value] is a [type]"
  4. Nếu phép xác nhận kiểu thất bại, in ra: "Failed: value is not a [type]"

Bạn phải dùng cú pháp xác nhận kiểu an toàn với biến ok để kiểm tra xem phép xác nhận có thành công hay không. Thử thách này kiểm tra mức độ hiểu biết của bạn về cách lấy an toàn các giá trị cụ thể từ biến interface mà không khiến chương trình bị panic.

Để chuyển đổi giá trị boolean, "true" phải được chuyển thành true, còn mọi chuỗi khác phải được chuyển thành false. Dùng package strconv để chuyển chuỗi thành số nguyên.

Tự làm thử

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// Đọc đầu vào
	var dataType string
	var valueStr string
	fmt.Scanln(&dataType)
	fmt.Scanln(&valueStr)
	
	// Biến (variable) để lưu giá trị interface
	var interfaceValue interface{}
	
	// TODO: Viết code của bạn bên dưới
	// 1. Chuyển valueStr sang kiểu phù hợp dựa trên dataType và lưu vào interfaceValue
	// 2. Dùng phép xác nhận kiểu để kiểm tra xem interfaceValue có chứa giá trị thuộc kiểu mong đợi không
	// 3. In ra thông báo thành công hoặc thất bại phù hợp
	
}
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