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)
	}
}