0

Bài 2: Các Động từ định dạng cơ bản (Formatting Verbs) trong package fmt

Các hàm có hậu tố f (như Printf, Sprintf, Fprintf) sử dụng một chuỗi mẫu chứa các ký tự đặc biệt gọi là "Động từ" (Verbs). Các Verbs này bắt đầu bằng dấu % và đóng vai trò như những chỗ trống định sẵn, chờ Go truyền biến vào và định dạng chúng theo đúng quy tắc.

Dưới đây là các Verbs phổ biến nhất mà bạn sẽ sử dụng hàng ngày khi code Go.

1. Phép thuật đa năng: %v (Value)

Nếu bạn không chắc biến của mình có kiểu dữ liệu gì (là chuỗi, số, bool hay struct), %v là chiếc "chìa khóa vạn năng". Go sẽ tự động phân tích kiểu dữ liệu và in ra định dạng phù hợp nhất.

Go

package main

import "fmt"

func main() {
	name := "Hiếu"
	age := 22
	isDev := true

	// %v tự động xử lý mọi kiểu dữ liệu
	fmt.Printf("Tên: %v, Tuổi: %v, Dev: %v\n", name, age, isDev)
	// Kết quả: Tên: Hiếu, Tuổi: 22, Dev: true
}

Mẹo gỡ lỗi: Khi kết hợp %v với các cờ đặc biệt, nó trở thành công cụ debug struct cực kỳ mạnh mẽ (sẽ học chi tiết ở Bài 4):

  • %+v: In struct kèm theo tên trường (field name).

  • %#v: In cấu trúc data y hệt như cú pháp code Go (có cả tên package, khai báo kiểu).

2. Truy tìm kiểu dữ liệu: %T (Type)

Go là ngôn ngữ định kiểu tĩnh (statically typed). Khi bạn nhận dữ liệu từ các thư viện JSON (trả về kiểu interface{}) hoặc dùng Reflection, bạn rất cần biết chính xác kiểu dữ liệu thực tế đang nằm trong bộ nhớ là gì. %T sẽ in ra tên của Type đó.

Go

package main

import "fmt"

func main() {
	var data interface{} = 99.5

	fmt.Printf("Giá trị là %v, mang kiểu dữ liệu: %T\n", data, data)
	// Kết quả: Giá trị là 99.5, mang kiểu dữ liệu: float64
}

3. Nhóm định dạng kiểu nguyên thủy (Primitive Types)

Tuy %v rất tiện, nhưng khi cần kiểm soát chính xác hoặc tối ưu hiệu năng định dạng, bạn nên dùng các Verbs chuyên biệt:

  • %s (String): Dành riêng cho chuỗi hoặc mảng byte ([]byte).

  • %d (Decimal): Dành cho số nguyên hệ thập phân (int, int32, int64).

  • %t (Boolean): In ra chữ true hoặc false.

Go

package main

import "fmt"

func main() {
	lang := "Golang"
	year := 2009

	fmt.Printf("Ngôn ngữ %s ra đời năm %d\n", lang, year)
}

4. Định dạng số thực (Float): %f

Khi làm việc với giá trị tiền tệ, tỷ lệ phần trăm hoặc tọa độ, bạn thường dùng kiểu float32 hoặc float64. Verb %f mặc định in ra số thực với 6 chữ số thập phân sau dấu phẩy, điều này thường làm chuỗi trở nên rối mắt.

Bạn có thể giới hạn số lượng chữ số thập phân bằng cách thêm .N vào giữa (ví dụ %.2f để lấy 2 số).

Go

package main

import "fmt"

func main() {
	pi := 3.14159265359

	// Mặc định (6 số)
	fmt.Printf("Mặc định: %f\n", pi)     
	// Kết quả: Mặc định: 3.141593 (Tự động làm tròn số cuối)

	// Giới hạn 2 số sau dấu phẩy (Thường dùng cho Tiền tệ)
	fmt.Printf("Tiền tệ: %.2f VNĐ\n", 500.899) 
	// Kết quả: Tiền tệ: 500.90 VNĐ
}

5. Căn lề và khoảng cách (Width & Alignment)

Khi bạn muốn in dữ liệu dưới dạng bảng (table) trên Terminal, bạn cần các cột thẳng hàng với nhau. Bạn có thể chèn một con số (chiều rộng tối thiểu) vào giữa dấu % và Verb.

  • %10s: Dành đúng 10 khoảng trắng, in chuỗi vào đó và căn lề phải.

  • %-10s: Dành đúng 10 khoảng trắng, in chuỗi vào đó và căn lề trái (thêm dấu trừ).

  • %05d: Đối với số nguyên, dành 5 ô chứa, nhưng điền số 0 vào các ô trống thay vì khoảng trắng (rất hữu ích khi format mã nhân viên, mã đơn hàng).

Go

package main

import "fmt"

func main() {
	fmt.Println("STT |   Mã NV | Họ tên     | Lương")
	fmt.Println("-----------------------------------")
	
	// %-10s: Chuỗi, căn trái, rộng 10 ô
	// %05d: Số nguyên, rộng 5 ô, điền số 0 vào khoảng trống bên trái
	
	fmt.Printf("%3d | %05d | %-10s | %6.1f\n", 1, 45, "Hiếu", 1500.5)
	fmt.Printf("%3d | %05d | %-10s | %6.1f\n", 2, 9, "Alice", 2100.0)
	fmt.Printf("%3d | %05d | %-10s | %6.1f\n", 3, 1024, "Bob", 950.0)
}

Kết quả hiển thị trên Terminal sẽ tạo thành một bảng ngay ngắn:

Plaintext

STT |   Mã NV | Họ tên     | Lương
-----------------------------------
  1 | 00045 | Hiếu       | 1500.5
  2 | 00009 | Alice      | 2100.0
  3 | 01024 | Bob        |  950.0

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí