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

interface error

ส่งคืนและตรวจสอบข้อผิดพลาดตามแนวทางของ Go

interface error เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปรัชญาของ Go เกี่ยวกับข้อผิดพลาด

Go จัดการข้อผิดพลาดในรูปของค่า ไม่ใช่ข้อยกเว้น ฟังก์ชันจะคืนค่า error เป็นค่าที่คืนค่ารายการสุดท้าย ผู้เรียกใช้ต้องตรวจสอบค่านี้อย่างชัดเจน:

package main
import ("fmt"; "strconv")

func main() {
    n, err := strconv.Atoi("abc")
    if err != nil {
        fmt.Println("error:", err)  // handle it
        return
    }
    fmt.Println(n)
}

อินเทอร์เฟซของข้อผิดพลาด

error ในตัวเป็นอินเทอร์เฟซอย่างง่าย:

// Built into Go — no import needed
type error interface {
    Error() string
}

// Any type with Error() string satisfies it
// nil means no error

การคืนค่าข้อผิดพลาด

ฟังก์ชันที่อาจทำงานล้มเหลวจะคืนค่า (value, error) ให้คืนค่า nil เมื่อไม่มีข้อผิดพลาด:

package main
import ("fmt"; "errors")

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0)
    if err != nil {
        fmt.Println("error:", err)
        return
    }
    fmt.Println(result)
}

รูปแบบ if err != nil

การตรวจสอบ if err != nil เป็นสำนวนที่ใช้บ่อยที่สุดใน Go ควรจัดการข้อผิดพลาดเสมอ — อย่าเพิกเฉยต่อข้อผิดพลาด:

package main
import ("fmt"; "os")

func main() {
    f, err := os.Open("config.json")
    if err != nil {
        fmt.Println("open error:", err)
        return
    }
    defer f.Close()
    // use f...
    _ = f
}

errors.New — ค่าข้อผิดพลาดอย่างง่าย

errors.New สร้างข้อผิดพลาดอย่างง่ายด้วยข้อความตายตัว:

package main
import ("fmt"; "errors")

var ErrNotFound = errors.New("not found")

func findByID(id int) (string, error) {
    data := map[int]string{1: "Alice"}
    v, ok := data[id]
    if !ok {
        return "", ErrNotFound
    }
    return v, nil
}

func main() {
    _, err := findByID(99)
    fmt.Println(err) // not found
}

fmt.Errorf — ข้อความข้อผิดพลาดที่จัดรูปแบบ

fmt.Errorf สร้างข้อผิดพลาดพร้อมบริบทจากข้อความที่จัดรูปแบบ:

package main
import "fmt"

func openConfig(path string) error {
    // Add context to the error message
    return fmt.Errorf("openConfig %s: file not found", path)
}

func main() {
    err := openConfig("/etc/app/config.yaml")
    fmt.Println(err)
    // openConfig /etc/app/config.yaml: file not found
}

ข้อผิดพลาดค่าประจำ

ข้อผิดพลาดค่าประจำ คือค่าข้อผิดพลาดระดับแพ็กเกจที่ใช้เปรียบเทียบเอกลักษณ์:

package main
import ("fmt"; "errors")

var (
    ErrTimeout    = errors.New("timeout")
    ErrPermission = errors.New("permission denied")
)

func doRequest() error { return ErrTimeout }

func main() {
    err := doRequest()
    if errors.Is(err, ErrTimeout) {
        fmt.Println("request timed out — retrying")
    }
}

การเพิกเฉยต่อข้อผิดพลาดคือบั๊ก

Go กำหนดให้ใช้ตัวแปรที่ประกาศไว้ทุกตัว — แต่การเพิกเฉยต่อข้อผิดพลาดด้วย _ ยังสามารถคอมไพล์ได้และเป็นข้อผิดพลาดที่พบบ่อยซึ่งควรหลีกเลี่ยง:

package main
import "os"

func bad() {
    os.Remove("temp.txt") // silently ignores error — bad practice
}

func good() error {
    if err := os.Remove("temp.txt"); err != nil {
        return err  // propagate
    }
    return nil
}

บริบทของข้อผิดพลาด: การเพิ่มข้อมูล

เมื่อส่งต่อข้อผิดพลาดขึ้นไปตามลำดับการเรียกใช้ ให้เพิ่มบริบทที่อธิบายว่าการดำเนินการใดล้มเหลว:

package main
import "fmt"

func readConfig(path string) ([]byte, error) {
    return nil, fmt.Errorf("readConfig: %w", fmt.Errorf("file %s not found", path))
}

func setup() error {
    _, err := readConfig("/etc/app.cfg")
    if err != nil {
        return fmt.Errorf("setup: %w", err) // wrap with context
    }
    return nil
}

func main() {
    err := setup()
    fmt.Println(err) // setup: readConfig: file /etc/app.cfg not found
}

การคืนค่าข้อผิดพลาดหลายรายการ

ฟังก์ชันอาจคืนค่าข้อผิดพลาดจากจุดที่ล้มเหลวหลายจุด ให้ตรวจสอบทุกจุด:

package main
import ("fmt"; "strconv")

func parseRange(minStr, maxStr string) (int, int, error) {
    min, err := strconv.Atoi(minStr)
    if err != nil { return 0, 0, fmt.Errorf("min: %w", err) }
    max, err := strconv.Atoi(maxStr)
    if err != nil { return 0, 0, fmt.Errorf("max: %w", err) }
    if min > max { return 0, 0, fmt.Errorf("min %d > max %d", min, max) }
    return min, max, nil
}

func main() {
    lo, hi, err := parseRange("1", "10")
    if err != nil { fmt.Println(err); return }
    fmt.Println(lo, hi)
}

ตรวจสอบอย่างรวดเร็ว

ค่าข้อผิดพลาดที่คืนเป็น nil บ่งบอกอะไรใน Go

สรุปทบทวน: อินเทอร์เฟซของข้อผิดพลาด

แนวคิดสำคัญเกี่ยวกับการจัดการข้อผิดพลาด:

  • ข้อผิดพลาดเป็นอินเทอร์เฟซในตัว: Error() string
  • คืนค่า (value, error) — nil หมายถึงทำงานสำเร็จ
  • ใช้ errors.New สำหรับข้อผิดพลาดอย่างง่าย และ fmt.Errorf สำหรับข้อผิดพลาดที่จัดรูปแบบ
  • ตรวจสอบ if err != nil เสมอ
  • เพิ่มบริบทเมื่อส่งต่อข้อผิดพลาดขึ้นไปตามลำดับการเรียกใช้
  • อย่าเพิกเฉยต่อข้อผิดพลาดโดยไม่แจ้งให้ทราบ

คำถามที่พบบ่อย

บทเรียน “interface error” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “interface error” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “interface error”

ส่งคืนและตรวจสอบข้อผิดพลาดตามแนวทางของ Go คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “interface error” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. interface error
  2. การสร้างข้อผิดพลาดแบบกำหนดเอง
  3. การห่อและคลายข้อผิดพลาด
  4. panic, recover และ defer
← กลับไปที่ Go Academy