Trong Go, bạn có thể kiểm tra kiểu của một biến trong thời gian chạy (runtime) bằng cách sử dụng type assertiontype switch. Cả hai phương pháp này đều cho phép bạn xác định kiểu cụ thể của một biến mà bạn biết nó có thể là một trong nhiều kiểu khác nhau. Dưới đây là cách sử dụng cả hai phương pháp này.

1. Type Assertion

Type assertion cho phép bạn lấy kiểu thực tế của một biến và chuyển đổi nó sang kiểu mà bạn mong muốn. Cú pháp của type assertion là v.(T), trong đó v là biến và T là kiểu mà bạn muốn kiểm tra.

Ví dụ về Type Assertion:

package main

import (
    "fmt"
)

func main() {
    var x interface{} = "Hello, Go!" // interface{} có thể chứa bất kỳ kiểu nào

    // Sử dụng type assertion
    str, ok := x.(string)
    if ok {
        fmt.Println("x is a string:", str)
    } else {
        fmt.Println("x is not a string")
    }

    // Kiểm tra với một kiểu khác
    num, ok := x.(int)
    if ok {
        fmt.Println("x is an int:", num)
    } else {
        fmt.Println("x is not an int")
    }
}

Giải thích

  • interface{}: Đây là kiểu dữ liệu rỗng trong Go, cho phép bạn lưu trữ bất kỳ kiểu dữ liệu nào.
  • Type Assertion: Khi bạn thực hiện x.(string), bạn đang kiểm tra xem biến x có phải là kiểu string hay không. Nếu đúng, biến str sẽ chứa giá trị và ok sẽ là true. Nếu không, ok sẽ là false.

2. Type Switch

Type switch cho phép bạn kiểm tra nhiều kiểu khác nhau cho một biến trong một cấu trúc đơn giản hơn so với việc sử dụng nhiều type assertion.

Ví dụ về Type Switch:

package main

import (
    "fmt"
)

func checkType(x interface{}) {
    switch v := x.(type) {
    case string:
        fmt.Println("x is a string:", v)
    case int:
        fmt.Println("x is an int:", v)
    case float64:
        fmt.Println("x is a float64:", v)
    default:
        fmt.Println("x is of a different type")
    }
}

func main() {
    checkType("Hello, Go!")
    checkType(42)
    checkType(3.14)
    checkType(true)
}

Giải thích

  • Type Switch: Cú pháp switch v := x.(type) cho phép bạn kiểm tra kiểu của x và tự động gán giá trị vào biến v với kiểu tương ứng.
  • Case Statements: Mỗi case kiểm tra một kiểu khác nhau. Nếu kiểu của x khớp với một trong các kiểu trong các case, mã trong case đó sẽ được thực thi.

Kết luận

Việc kiểm tra kiểu của một biến trong Go có thể được thực hiện thông qua type assertion và type switch. Cả hai phương pháp này giúp bạn xác định kiểu thực tế của một biến trong thời gian chạy và xử lý nó một cách thích hợp. Type assertion thích hợp cho các tình huống đơn giản, trong khi type switch cung cấp một cách tiếp cận linh hoạt hơn khi bạn cần kiểm tra nhiều kiểu khác nhau.