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 đó.
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à:
- 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
- Với
- 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
- Nếu phép xác nhận kiểu thành công, in ra:
"Success: [value] is a [type]" - 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
}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