Biến và Kiểu Dữ Liệu
Khai báo biến
Go có hai cách khai báo biến:
// Cách 1: var – tường minh, khai báo được cả ngoài hàm
var ten string = "Ngọc"
var tuoi int = 25
var ok bool = true
// Cách 2: short declaration := (phổ biến hơn, chỉ trong hàm)
ten := "Ngọc"
tuoi := 25
ok := true
// Khai báo nhiều biến cùng lúc
x, y, z := 1, 2, 3
a, b := b, a // swap giá trị
Các kiểu số nguyên
// Có dấu
var a int8 = 127 // -128 đến 127
var b int16 = 32767 // -32768 đến 32767
var c int32 = 2147483647
var d int64 = 9223372036854775807
var e int = 42 // size phụ thuộc nền tảng (32 hoặc 64 bit)
// Không dấu
var ua uint8 = 255 // 0 đến 255 (còn gọi là byte)
var ub uint16 = 65535
var uc uint = 100
// Trong thực tế: dùng int hầu hết, chỉ dùng int32/int64 khi cần cụ thể
Kiểu số thực
var f32 float32 = 3.14 // độ chính xác ~7 chữ số thập phân
var f64 float64 = 3.14 // độ chính xác ~15 chữ số thập phân (dùng cái này!)
// Luôn dùng float64 trừ khi có lý do đặc biệt về memory
String và Rune
s := "Xin chào" // string là chuỗi byte UTF-8, bất biến
fmt.Println(len(s)) // 10 (bytes, không phải ký tự!)
// Duyệt từng ký tự Unicode đúng cách dùng range
for i, r := range s {
fmt.Printf("index=%d rune=%c\n", i, r)
}
// Rune = int32, đại diện cho một code point Unicode
r := 'A' // type là rune
fmt.Println(r) // 65 (mã ASCII của 'A')
Zero Value — Giá trị mặc định
Mọi biến khi khai báo mà không gán đều có zero value:
var i int // 0
var f float64 // 0.0
var s string // "" (chuỗi rỗng)
var b bool // false
var p *int // nil
Hằng số và iota
const Pi = 3.14159
const MaxRetry = 3
const Greeting = "Xin chào"
// iota: tạo chuỗi hằng số tự tăng
type Weekday int
const (
Sunday Weekday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
Chuyển đổi kiểu — phải tường minh
var i int = 42
var f float64 = float64(i) // phải ép kiểu tường minh
var u uint = uint(f)
// KHÔNG được:
// var f float64 = i // lỗi compile: cannot use i (int) as float64
example.go
package main
import "fmt"
type Direction int
const (
North Direction = iota
East
South
West
)
func (d Direction) String() string {
return [...]string{"Bắc", "Đông", "Nam", "Tây"}[d]
}
func main() {
// Khai báo và zero values
var count int
var name string
var active bool
fmt.Printf("count=%d, name=%q, active=%v\n", count, name, active)
// Short declaration
score := 9.5
grade := "A"
fmt.Printf("Điểm: %.1f, Loại: %s\n", score, grade)
// iota enum
dir := North
fmt.Println("Hướng:", dir)
// Duyệt string UTF-8
s := "Go 🐹"
for i, r := range s {
fmt.Printf("[%d] %c\n", i, r)
}
}