Ngôn ngữ lập trình Golang quy định chặt chẽ và nghiệm ngặt về kiểu dữ liệu, do đó không cho phép tự động chuyển đổi kiểu dữ liệu (ép kiểu dữ liệu)
Ép kiểu trong Golang
Trong Go, các kiểu dữ liệu có thể chuyển đổi bằng cách sử dụng toán tử type(value)
.
Đoạn code sau đây sẽ báo lỗi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
import (
"fmt"
)
func main() {
a := 5 //int
b := 3.4 //float64
sum := a + b
fmt.Println(sum)
}
// Lỗi: invalid operation: a + b (mismatched types int and float64)
Code trên không chạy vì Golang là một ngôn ngữ kiểu dữ liệu cứng, kiểu dữ liệu của biến phải được xác định trong khi khai báo, và không thể thay đổi được sau đó. Trong trường hợp của bạn, biến a
được khai báo là kiểu int
và biến b
được khai báo là kiểu float64
, vì vậy họ không thể cộng lại với nhau mà không ép kiểu.
Để giải quyết vấn đề này, bạn cần ép kiểu cho biến a sang kiểu float64
trước khi thực hiện phép cộng:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
import (
"fmt"
)
func main() {
a := 5 //int
b := 3.4 //float64
sum := float64(a) + b
fmt.Println(sum)
}
// Kết quả là 8.4
Hoặc bạn có thể ép kiểu cho biến b
thành kiểu int
, nhưng lại sẽ mất phần thập phân của b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
import (
"fmt"
)
func main() {
a := 5 //int
b := 3.4 //float64
sum := a + int(b)
fmt.Println(sum)
}
// Kết quả là 8
Chú ý khi ép kiểu chuyển giữa kiểu số thực và kiểu số thực, có thể mất dữ liệu do việc làm tròn hoặc thiếu phần thập phân. Do đó, bạn cần phải cân nhắc kỹ trước khi ép kiểu và xem xét xem ép kiểu này có hợp lý trong tình huống cụ thể của bạn hay không.
Sử dụng strconv để chuyển đổi chuỗi và số trong Golang
Go cung cấp thư viện strconv
để hỗ trợ chuyển đổi giữa các kiểu dữ liệu chuỗi và các kiểu số.
Chuyển đổi chuỗi sang số
Bạn có thể sử dụng hàm strconv.Atoi(string)
để chuyển đổi chuỗi sang kiểu int:
1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
"strconv"
)
func main() {
var myString string = "101"
var myInt, _ = strconv.Atoi(myString) // ép kiểu string sang int
fmt.Println(myInt) // in ra 101
}
Trong ví dụ trên, hàm Atoi
trả về hai giá trị, giá trị int
được ép kiểu và lỗi nếu có
Bạn cũng có thể sử dụng hàm strconv.ParseFloat(string, bitSize)
để chuyển đổi chuỗi sang kiểu float64
:
1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
"strconv"
)
func main() {
var myString string = "3.14"
var myFloat, _ = strconv.ParseFloat(myString, 64) // ép kiểu string sang float64, với bitSize = 64
fmt.Println(myFloat) // in ra 3.14
}
Trong ví dụ trên, hàm ParseFloat
trả về hai giá trị, giá trị float64
được ép kiểu và lỗi nếu có.
Chuyển đổi số sang chuỗi
Bạn có thể sử dụng hàm strconv.Itoa(int)
để chuyển đổi kiểu int
sang chuỗi:
1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
"strconv"
)
func main() {
var myInt int = 101
var myString = strconv.Itoa(myInt) // ép kiểu int sang string
fmt.Println(myString) // in ra "101"
}
Cũng giống như ép kiểu bằng toán tử, khi ép kiểu sử dụng hàm strconv cũng có thể mất dữ liệu do việc làm tròn hoặc thiếu phần thập phân. Do đó, bạn cần phải cân nhắc kỹ trước khi ép kiểu và xem xét xem ép kiểu này có hợp lý trong tình huống cụ thể của bạn hay không.