0Pricing
Go Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดและใช้งาน interface
  2. interface ของไลบรารีมาตรฐานหลัก
  3. การยืนยันชนิดข้อมูลและสวิตช์ชนิดข้อมูล
  4. การประกอบ interface และแนวทางปฏิบัติที่ดี
← กลับไปที่ Go Academy