07/09/2018, 11:14

Type Conversion trong Golang

Golang hỗ trợ tính năng chuyển đổi kiểu dữ liệu ( type conversion ) giúp chúng ta có thể dễ dang chuyển kiểu dữ liệu từ dạng này sang dạng khác. Sử dụng cú pháp TypeA(valueTypeB) để chuyển đối giá trị valueTypeB (kiểu dữ liệu TypeB) về giá trị thuộc kiểu TypeA. Ví dụ: var myInt = 100 var ...

Golang hỗ trợ tính năng chuyển đổi kiểu dữ liệu (type conversion) giúp chúng ta có thể dễ dang chuyển kiểu dữ liệu từ dạng này sang dạng khác. Sử dụng cú pháp TypeA(valueTypeB) để chuyển đối giá trị valueTypeB (kiểu dữ liệu TypeB) về giá trị thuộc kiểu TypeA.

Ví dụ:

var myInt = 100
var myString string
myString = string(myInt)
fmt.PrintLn("type: %T, value: %v", myString, myString) // type: string, value: 100

Tuy nhiên việc chuyển đổi chỉ hợp lệ nếu như hai kiểu dữ lieuj có thể chuyển đổi cho nhau. Ví dụ nếu bạn muốn chuyển từ kiểu bool sang string thì bạn không thể làm như sau:

var myBool bool
var myString string
myBool = true
myString = string(myBool)

Khi compile đoạn code trên Golang compiler sẽ báo lỗi:

bool_to_str.go:9: cannot convert myBool (type bool) to type string

Lý do là vì bool và string là hai kiểu dữ liệu không thể chuyển đổi qua lại.

Hay nói cách khác chúng ta chỉ có thể chuyển đổi từ kiểu T1 sang T2 nếu như chúng có cùng kiểu nền tảng (underlying type).

Hãy cùng tham khảo thêm một ví dụ sau đây để có thể hiểu hơn về underlying type:

package main

import (
    "fmt"
)

func main() {
    type TestType string
    var testValue TestType
    testValue = "Xin Chào"

    fmt.Printf("testValue type: %T
", testValue)
    fmt.Printf("testValue value: %v
", testValue)

    var myString = string(testValue)
    fmt.Println(myString)
}

Khi chạy đoạn code trên bạn sẽ thấy kết quả hiển thị như sau:

testValue type: main.TestType
testValue value: Xin Chào
Xin Chào

Mặc dù TestType là một kiểu dữ liệu tùy biến (custom type) tuy nhiên kiểu dữ liệu mà chúng ta dựa trên đó để dịnh nghĩa TestType là string do đó chúng ta có thể chuyển đổi giá trị thuộc kiểu TestType về dữ liệu kiểu string.

Nếu TestType ở trên là một interface bạn có thể sử dụng tính năng type assertion để kiểm tra kiểu dữ liệu của một giá trị cho trước:

package main

import (
    "fmt"
)

func main() {
    type TestType interface{}
    var testVal TestType = "Hello World"

    val, ok := testVal.(string)
    if !ok {
        fmt.Printf("Lỗi! Không thể chuyển đổi sang string.")
    }
    fmt.Printf("val: %v", val)

}

Hiển thị: val: Hello World

Lưu ý rắng bạn chỉ có thể sử dụng type assertion với giá trị thuộc kiểu interface.

Kết Luận

Khi sử dụng tính năng type conversion trong Golang chúng ta cần lưu ý tới mối liên hệ giữa hai kiểu dữ liệu. Cần kiểm tra hai kiểu dữ liệu này có thể chuyển đổi được qua lại hay không trước khi thực hiện việc chuyển đổi.

0