Interface rỗng
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 16 trên 68.
Đến giờ, bạn đã làm việc với các giao diện yêu cầu những phương thức cụ thể, nhưng Go có một giao diện đặc biệt rất linh hoạt: giao diện rỗng, được viết là interface{}.
Interface rỗng không yêu cầu phương thức nào, nghĩa là mọi kiểu dữ liệu trong Go đều tự động thỏa mãn interface này. Vì mọi kiểu dữ liệu đều triển khai không phương thức nào (ít nhất là vậy), nên mọi kiểu dữ liệu đều có thể được gán cho một biến interface{}:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // sliceĐiều này khiến interface{} trở nên cực kỳ hữu ích khi bạn cần làm việc với dữ liệu có kiểu chưa xác định hoặc thay đổi. Bạn có thể gặp trường hợp này khi đọc tệp cấu hình, xử lý đầu vào của người dùng hoặc làm việc với các API trả về những kiểu dữ liệu khác nhau tùy vào tình huống.
Tuy nhiên, vì interface rỗng có thể chứa bất kỳ kiểu dữ liệu nào, bạn thường cần xác định kiểu dữ liệu thực sự được lưu bên trong trước khi có thể sử dụng giá trị đó một cách phù hợp. Đây là lúc ép kiểu và câu lệnh switch theo kiểu (bạn sẽ học ở phần tiếp theo) trở thành công cụ thiết yếu để làm việc an toàn với các giá trị interface{}.
Thử thách
DễTrong thử thách này, bạn sẽ luyện tập làm việc với interface rỗng bằng cách tạo một bộ xử lý dữ liệu có thể xử lý nhiều kiểu giá trị khác nhau. Bạn sẽ tạo một hàm (function) nhận tham số interface{} và xử lý nhiều kiểu dữ liệu.
Bạn sẽ nhận hai đầu vào:
- Một chuỗi biểu thị kiểu dữ liệu (ví dụ:
"int","string","bool"hoặc"slice") - Một chuỗi biểu thị giá trị thực tế (ví dụ:
"42","hello","true"hoặc"1,2,3")
Nhiệm vụ của bạn là:
- Tạo một hàm có tên
processData, nhận tham sốinterface{}và in thông tin về giá trị - Dựa trên đầu vào kiểu dữ liệu, chuyển chuỗi giá trị sang kiểu Go phù hợp:
- Với
"int": chuyển thành số nguyên - Với
"string": dùng làm chuỗi - Với
"bool": chuyển thành giá trị boolean - Với
"slice": chuyển các giá trị phân tách bằng dấu phẩy thành một slice gồm các số nguyên
- Với
- Gọi hàm
processDatavới giá trị đã chuyển đổi - Bên trong
processData, in giá trị và kiểu dữ liệu của nó theo định dạng:"Value: [value], Type: [type]"
Với đầu vào slice, chuỗi phân tách bằng dấu phẩy như "1,2,3" cần được chuyển thành []int{1, 2, 3}. Hàm này có thể hoạt động với mọi kiểu vì nó nhận interface{}, qua đó cho thấy interface rỗng có thể chứa giá trị thuộc bất kỳ kiểu nào. Dùng fmt.Printf với các động từ định dạng %v và %T để lần lượt hiển thị giá trị và kiểu dữ liệu.
Tự làm thử
package main
import (
"fmt"
)
func main() {
// Đọc đầu vào
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// TODO: Viết code bên dưới
// 1. Tạo hàm (function) processData nhận interface{}
// 2. Chuyển valueStr sang kiểu dữ liệu phù hợp dựa trên dataType
// 3. Gọi processData với giá trị đã chuyển đổi
}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