Menu
CoddyTech

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{}.

challenge icon

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

  1. Tạo một hàm có tên processData, nhận tham số interface{} và in thông tin về giá trị
  2. 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
  3. Gọi hàm processData với giá trị đã chuyển đổi
  4. 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
	
}
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