DEV Community

Pallat Anchaleechamaikorn
Pallat Anchaleechamaikorn

Posted on

อธิบาย package fmt เบื้องต้นในภาษา Go

#go

สำหรับคนที่เพิ่งเริ่มต้นเขียนภาษา Go ใหม่ๆ อาจจะยังไม่คุ้นชินกับการใช้ package fmt https://pkg.go.dev/fmt ยกตัวอย่างเช่น

import "fmt"

func main() {
    var a any
    a = 10
    fmt.Printf("%T %v\n", a, a)
}
Enter fullscreen mode Exit fullscreen mode

คำอธิบายของ package นี้ เขาบอกว่ามันใช้สำหรับการจัดการรูปแบบการแสดงผล และการรับข้อมูลผ่าน I/O ที่มีลักษณะการใช้งานคล้ายกับ printf และ scanf ในภาษา C

โดยการใช้งาน fmt ที่ง่ายสุดและไม่ต้องคิดอะไรมาก ก็คือการใส่ของที่ต้องการให้แสดงผลลงไปตรงๆเช่น

    a := 10
    b := true
    c := "test"
    fmt.Println(a, b, c)
Enter fullscreen mode Exit fullscreen mode

การที่ Println สามารถรับตัวแปรประเภทใดก็ได้เข้าไปเป็น parameter คือการที่มันรับ type เข้าไปเป็น ...any หรือ ...interface{} นั่นเอง แต่นั่นก็ทำให้ฟังก์ชั่นนี้ จะต้องทำงานหนักขึ้น เพราะการจะแสดงผลออกไปให้ถูกต้องตาม type ที่แท้จริงของค่านั้นๆ มันจำเป็นจะต้องทำการ reflect ของทั้งหมดอย่างละเอียดไปจนกว่าจะพบ interface ที่จะสามารถทำงานกับ type นั้นได้

แต่ที่ส่วนมากเราจะติดกัน มักจะเป็นฟังก์ชั่นที่ชื่อลงท้ายด้วย f เช่น Printf เพราะเจ้าพวกนี้ เราจะต้องเล่นกับตัว specifier พวกที่ขึ้นต้นด้วยเครื่องหมาย % และ \ เช่น

fmt.Printf("%s\n", s)
Enter fullscreen mode Exit fullscreen mode

โดยการวาง specifier จะต้องวางค่าเรียงลำดับจากซ้ายไปขวา เทียบกับตัวแปร หรือ constant ใดๆ ตั้งแต่ parameter ตัวที่ 2 เป็นต้นไปให้ตรงกัน โดยในที่นี้

%s จะถูกแทนด้วยค่าในตัวแปร s
หรือ fmt.Printf("%s %d %t", name, num, ok)
%s จะถูกแทนด้วยค่า name
%d จะถูกแทนด้วยค่า num
%t จะถูกแทนด้วยค่า ok

โดยจะขออธิบายบางส่วนของการใช้สัญลักษณ์เหล่านี้คร่าวๆ

%d - ใช้แสดงผลตัวเลขแบบ decimal (ฐาน 10) กับตัวแปร type int, uint ทั้งหมด เช่น int8, uint16
%o - ใช้แสดงผลตัวเลขแบบ octal (ฐาน 8) กับตัวแปร type int, uint ทั้งหมด เช่น int8, uint16
%o - ใช้แสดงผลตัวเลขแบบ octal (ฐาน 8) กับตัวแปร type int, uint ทั้งหมด เช่น int8, uint16 โดยจะแสดงแบบมี 0o นำหน้าเลข
%o - ใช้แสดงผลตัวเลขแบบ binary กับตัวแปร type int, uint ทั้งหมด เช่น int8, uint16
%x - ใช้แสดงผลตัวเลขแบบ hexadecimal กับตัวแปร type int, uint ทั้งหมด เช่น int8, uint16 โดยแสดงเป็นอักษรพิมพ์เล็ก
%X - ใช้แสดงผลตัวเลขแบบ hexadecimal กับตัวแปร type int, uint ทั้งหมด เช่น int8, uint16 โดยแสดงเป็นอักษรพิมพ์ใหญ่
%f - แสดงเลขฐาน 10 แบบมีทศนิยม ใช้กับตัวแปร float32 และ float64 โดยสามารถกำหนด digit ได้เช่น "%.3f"
%s - แสดงข้อความจาก type string หรือ []byte
%q - แสดงข้อความแบบเดียวกับ %s และมี double quote ครอบ เช่น "test"
%t - แสดงค่า true/false จาก type bool
%v - แสดงค่า default format ของ type นั้นๆ
%#v - แสดงค่า default format พร้อมกับ โครงสร้างของ type ด้วย
%T - แสดง type ของค่านั้น
%p - แสดงค่า address ของ type ที่เป็น pointer
\n - new line

นี่คือบางส่วนที่เราจะได้ใช้กันค่อนข้างบ่อย โดยอาจจะมีลูกเล่นบางอย่างเพิ่มเช่น
ถ้าอยากแสดงค่า integer แบบกำหนดจำนวน digit โดยค่าที่จำนวน digit ไม่ครบ ให้แสดงเลข 0 ข้างหน้าเช่น 003

fmt.Printf("%3d\n", 3)
Enter fullscreen mode Exit fullscreen mode

หรือแสดงข้อความให้ชิดซ้าย หรือชิดขวา

fmt.Printf("%10s\n", "test...")
fmt.Printf("%-10s\n", "test...")
Enter fullscreen mode Exit fullscreen mode

นี่เป็นการใช้งานพื้นฐานเบื้องต้นมากๆ และทั้งหมดนี้มีอธิบายใน https://pkg.go.dev/fmt อยู่แล้ว สามารถอ่านและทดลองด้วยตัวเองได้ไม่ยากครับ

Top comments (0)