Go Zero to Hero - Bài 7: Các kiểu dữ liệu cơ bản (Int, Float, Boolean, String)
Trong Go, việc hiểu rõ các kiểu dữ liệu cơ bản không chỉ giúp bạn viết code chính xác mà còn là chìa khóa để tối ưu hóa bộ nhớ và hiệu năng cho các hệ thống backend quy mô lớn.
1. Số nguyên (Integer): Sự tỉ mỉ trong quản lý bộ nhớ
Nếu trong Python hay JavaScript, số nguyên đơn giản chỉ là kiểu Number hay int, thì Go bắt bạn phải rõ ràng hơn rất nhiều. Go cung cấp các kiểu số nguyên có kích thước cố định để bạn tối ưu hóa bộ nhớ:
- Có dấu (Âm và Dương):
int8,int16,int32,int64. - Không dấu (Chỉ có Dương và Số 0):
uint8,uint16,uint32,uint64(Chữuđứng cho unsigned).
Ví dụ thực tế: Nếu bạn cần lưu tuổi của một người (từ 0 đến 150), bạn chỉ cần dùng
uint8(giới hạn từ 0 đến 255, tốn đúng 1 byte RAM) thay vì dùngint64(tốn tới 8 bytes). Khi hệ thống của bạn xử lý hàng chục triệu bản ghi, sự tiết kiệm nhỏ này sẽ tạo ra khác biệt khổng lồ về chi phí hạ tầng.
Thế còn kiểu int và uint chung chung thì sao?
Nếu bạn chỉ khai báo là var count int, kích thước của nó sẽ phụ thuộc vào hệ điều hành (OS architecture) mà ứng dụng đang chạy:
- Trên HĐH 32-bit:
intcó kích thước 32 bit (giốngint32). - Trên HĐH 64-bit:
intcó kích thước 64 bit (giốngint64).
Hai bí danh (Alias) cực kỳ quan trọng cần nhớ:
Trong các luồng xử lý I/O, đọc ghi file, hay stream dữ liệu (như Kafka, TCP socket), bạn sẽ gặp hai kiểu này liên tục:
byte: Thực chất là bí danh củauint8. Nó đại diện cho dữ liệu thô (raw data).rune: Thực chất là bí danh củaint32. Nó đại diện cho một ký tự Unicode (ví dụ: chữ 'A', hay ký tự emoji '😁').
2. Số thực (Floating-point): Tại sao không có kiểu float chung chung?
Để lưu số thập phân (như giá tiền, tỷ lệ phần trăm), Go cung cấp hai kiểu:
float32: Số thực độ chính xác đơn (chiếm 4 bytes).float64: Số thực độ chính xác kép (chiếm 8 bytes).
Lưu ý thực chiến:
Go không có kiểu float chung chung. Khi bạn khai báo nhanh:
pi := 3.14159 // Go sẽ mặc định kiểu này là float64
Trong 99% trường hợp lập trình Backend, hãy mặc định sử dụng float64 để tránh các lỗi sai số làm tròn cực kỳ nguy hiểm trong tính toán tài chính. Chỉ dùng float32 khi bạn lập trình game 3D hoặc những hệ thống nhúng (embedded systems) cần ép RAM đến mức tối đa.
3. Kiểu Boolean (Đúng/Sai)
Kiểu này thì quá quen thuộc rồi, nó dùng để biểu diễn hai trạng thái logic: true (đúng) hoặc false (sai).
var isActive bool = true
isDeleted := false
- Zero Value: Nếu bạn khai báo
var isAdmin boolmà không gán giá trị, Go sẽ tự động gán cho nó làfalse. - Lưu ý: Khác với C hay Python (nơi số 0 được hiểu là
false, khác 0 làtrue), trong Go, kiểuboolđộc lập hoàn toàn. Bạn không thể ép kiểu một con số thànhboolhay ngược lại.
4. Chuỗi (String): Bất biến và chuẩn UTF-8
Xử lý chuỗi trong Go có những triết lý rất riêng mà các kỹ sư mới chuyển sang cần lưu ý.
Khải báo chuỗi:
Bạn có 2 cách để khai báo chuỗi:
- Dùng dấu ngoặc kép
"": Để tạo chuỗi trên một dòng. Có thể chứa các ký tự escape như\n(xuống dòng),\t(tab). - Dùng dấu backtick
`(nằm dưới phím Esc): Để tạo chuỗi nhiều dòng (Raw string literal). Mọi thứ bạn gõ bên trong (kể cả enter xuống dòng) đều được giữ nguyên. Cực kỳ tiện khi viết câu lệnh SQL query dài hoặc chuỗi JSON tĩnh.
// Chuỗi 1 dòng
name := "Hệ thống Bán Vé"
// Chuỗi nhiều dòng bằng dấu backtick
sqlQuery := `
SELECT id, name, status
FROM tickets
WHERE status = 'PAID'
`
Đặc tính quan trọng nhất: String là Bất biến (Immutable)
Một khi bạn đã tạo ra một chuỗi, bạn không thể thay đổi nội dung của nó ở một vị trí cụ thể.
text := "Hello"
text[0] = 'M' // LỖI! Go sẽ không cho phép biên dịch dòng này.
Mỗi khi bạn cộng chuỗi (text = text + " World"), Go sẽ âm thầm tạo ra một vùng nhớ hoàn toàn mới, copy nội dung cũ sang và dán thêm nội dung mới vào. Do đó, nếu phải cộng hàng nghìn chuỗi trong một vòng lặp, việc dùng dấu + sẽ làm chậm hệ thống. (Vấn đề này chúng ta sẽ giải quyết bằng gói strings.Builder ở các phần nâng cao).
Tổng kết
Tóm gọn lại "hành trang" dữ liệu hôm nay:
- Số nguyên: Dùng
intcho đại đa số trường hợp. Cần quản lý file/byte thì dùngbyte(uint8). - Số thực: Luôn ưu tiên
float64để đảm bảo độ chính xác. - Boolean: Đơn giản là
true/false, mặc định làfalse. - String: Luôn là UTF-8, hỗ trợ ngoặc kép
""cho một dòng và backtick`cho nhiều dòng. Hãy nhớ string là bất biến!
All rights reserved