interface ของไลบรารีมาตรฐานหลัก
fmt.Stringer, io.Reader, io.Writer
interface ของไลบรารีมาตรฐานหลัก เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
fmt.Stringer
fmt.Stringer มีเมธอดเดียวคือ String() string ใช้เมธอดนี้เพื่อควบคุมลักษณะที่ชนิดข้อมูลของคุณแสดงด้วย fmt.Println และ %v:
package main
import "fmt"
type Color int
const (Red Color = iota; Green; Blue)
func (c Color) String() string {
return []string{"Red","Green","Blue"}[c]
}
func main() {
fmt.Println(Red, Green, Blue) // Red Green Blue
}อินเทอร์เฟซ error
อินเทอร์เฟซในตัว error มีเมธอดเดียวคือ Error() string ชนิดข้อมูลใดก็ตามที่ใช้งานเมธอดนี้จะนำมาใช้เป็นข้อผิดพลาดได้:
package main
import "fmt"
type ValidationError struct{ Field, Msg string }
func (e *ValidationError) Error() string {
return e.Field + ": " + e.Msg
}
func validate(age int) error {
if age < 0 { return &ValidationError{"age", "must be non-negative"} }
return nil
}
func main() {
fmt.Println(validate(-1))
}io.Reader
io.Reader มีเมธอดเดียวคือ Read(p []byte) (n int, err error) ไฟล์ เนื้อหา HTTP สตริง และบัฟเฟอร์ ล้วนรองรับอินเทอร์เฟซนี้:
package main
import ("fmt"; "strings")
func countBytes(r interface{ Read([]byte)(int,error) }) int {
buf := make([]byte, 512)
total := 0
for {
n, err := r.Read(buf)
total += n
if err != nil { break }
}
return total
}
func main() {
r := strings.NewReader("hello world")
fmt.Println(countBytes(r)) // 11
}io.Writer
io.Writer มีเมธอดเดียวคือ Write(p []byte) (n int, err error) ใช้โดย fmt.Fprintf การบันทึกข้อมูล ตัวเขียนการตอบกลับ HTTP และอื่น ๆ:
package main
import ("bytes"; "fmt")
func main() {
var buf bytes.Buffer
fmt.Fprintf(&buf, "Hello, %s!", "Go")
fmt.Println(buf.String()) // Hello, Go!
}io.ReadWriter และ io.Closer
ไลบรารีมาตรฐานนำอินเทอร์เฟซขนาดเล็กมาประกอบเป็นอินเทอร์เฟซที่ใหญ่ขึ้น:
package main
import "io"
// io.ReadWriter = io.Reader + io.Writer
// io.ReadCloser = io.Reader + io.Closer
// io.ReadWriteCloser = all three
func process(rw io.ReadWriter) {
buf := make([]byte, 8)
rw.Read(buf)
rw.Write(buf)
}
func main() { _ = process }sort.Interface
sort.Interface ต้องการ Len() int, Less(i, j int) bool และ Swap(i, j int):
package main
import ("fmt"; "sort")
type ByLength []string
func (b ByLength) Len() int { return len(b) }
func (b ByLength) Less(i, j int) bool { return len(b[i]) < len(b[j]) }
func (b ByLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
func main() {
fruits := ByLength{"banana","apple","kiwi"}
sort.Sort(fruits)
fmt.Println([]string(fruits)) // [kiwi apple banana]
}http.Handler
http.Handler มีเมธอดเดียวคือ ServeHTTP(ResponseWriter, *Request) ทุกส่วนในชุดการทำงาน HTTP ของ Go สร้างอยู่บนอินเทอร์เฟซเดียวนี้:
package main
import ("fmt"; "net/http")
type Hello struct{}
func (h Hello) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, World!")
}
func main() {
http.ListenAndServe(":8080", Hello{})
}fmt.GoStringer
ใช้งาน GoString() string เพื่อควบคุมรูปแบบการแสดงชนิดข้อมูลของคุณด้วย %#v ซึ่งเป็นรูปแบบไวยากรณ์ของ Go:
package main
import "fmt"
type Version struct{ Major, Minor int }
func (v Version) GoString() string {
return fmt.Sprintf("Version{%d, %d}", v.Major, v.Minor)
}
func main() {
fmt.Printf("%#v\n", Version{1, 18}) // Version{1, 18}
}encoding.TextMarshaler
ใช้งาน MarshalText() ([]byte, error) และ UnmarshalText([]byte) error สำหรับการเข้ารหัสข้อความแบบกำหนดเอง เช่น สตริง JSON และ YAML:
package main
import "fmt"
type Status int
const (Active Status = iota; Inactive)
func (s Status) MarshalText() ([]byte, error) {
if s == Active { return []byte("active"), nil }
return []byte("inactive"), nil
}
func main() {
s := Active
b, _ := s.MarshalText()
fmt.Println(string(b)) // active
}การประกอบอินเทอร์เฟซมาตรฐาน
รวมอินเทอร์เฟซมาตรฐานเข้าด้วยกันด้วย io.TeeReader, io.MultiWriter และอื่น ๆ เพื่อสร้างกระบวนการส่งต่อข้อมูลที่มีประสิทธิภาพโดยไม่ต้องเขียนชนิดข้อมูลใหม่:
package main
import ("bytes"; "fmt"; "io"; "strings")
func main() {
r := strings.NewReader("hello")
var buf bytes.Buffer
tee := io.TeeReader(r, &buf)
io.ReadAll(tee)
fmt.Println(buf.String()) // hello
}ตรวจสอบอย่างรวดเร็ว
ชนิดข้อมูลต้องรองรับอินเทอร์เฟซใดจึงจะนำมาใช้เป็นข้อผิดพลาดใน Go ได้
สรุปทบทวน
อินเทอร์เฟซสำคัญในไลบรารีมาตรฐาน:
fmt.Stringer— การแสดงผลแบบกำหนดเองerror— ค่าข้อผิดพลาดio.Reader/io.Writer— การรับส่งข้อมูลแบบสตรีมsort.Interface— การเรียงลำดับแบบกำหนดเองhttp.Handler— การจัดการคำขอ HTTP
โจทย์ฝึกปฏิบัติ
ใช้งาน sort.Interface กับ []Person โดยที่ Person มีฟิลด์ Name และ Age เพื่อเรียงลำดับตามอายุจากมากไปน้อย จากนั้นพิมพ์รายการที่เรียงแล้ว
คำถามที่พบบ่อย
บทเรียน “interface ของไลบรารีมาตรฐานหลัก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “interface ของไลบรารีมาตรฐานหลัก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “interface ของไลบรารีมาตรฐานหลัก”
fmt.Stringer, io.Reader, io.Writer คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “interface ของไลบรารีมาตรฐานหลัก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดและใช้งาน interface
- interface ของไลบรารีมาตรฐานหลัก
- การยืนยันชนิดข้อมูลและสวิตช์ชนิดข้อมูล
- การประกอบ interface และแนวทางปฏิบัติที่ดี