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

การยืนยันชนิดข้อมูลและสวิตช์ชนิดข้อมูล

การยืนยันชนิดข้อมูลอย่างปลอดภัยและรูปแบบการใช้ switch

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

การยืนยันชนิดข้อมูล

การยืนยันชนิดข้อมูลจะแยกค่ารูปธรรมออกจากอินเทอร์เฟซ ไวยากรณ์คือ x.(T):

package main
import "fmt"

func main() {
    var i interface{} = "hello"
    s := i.(string)          // panics if wrong type
    fmt.Println(s, len(s))   // hello 5
}

การยืนยันสองค่าอย่างปลอดภัย

ใช้รูปแบบ comma-ok เพื่อหลีกเลี่ยงการหยุดทำงานเมื่อชนิดข้อมูลไม่ถูกต้อง:

package main
import "fmt"

func main() {
    var i interface{} = 42
    s, ok := i.(string)
    fmt.Println(s, ok)  // "" false
    n, ok := i.(int)
    fmt.Println(n, ok)  // 42 true
}

การสลับชนิดข้อมูล

การสลับชนิดข้อมูลจะเปรียบเทียบชนิดข้อมูลขณะทำงานของค่าอินเทอร์เฟซกับชนิดข้อมูลหลายชนิด:

package main
import "fmt"

func describe(i interface{}) string {
    switch v := i.(type) {
    case int:    return fmt.Sprintf("int: %d", v)
    case string: return fmt.Sprintf("string: %q", v)
    case bool:   return fmt.Sprintf("bool: %v", v)
    default:     return fmt.Sprintf("unknown: %T", v)
    }
}

func main() {
    fmt.Println(describe(42))
    fmt.Println(describe("hi"))
    fmt.Println(describe(3.14))
}

การสลับชนิดข้อมูลของ error

การสลับชนิดข้อมูลมีประโยชน์อย่างยิ่งสำหรับการจัดหมวดหมู่ข้อผิดพลาด:

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

type NotFoundError struct{ Name string }
func (e *NotFoundError) Error() string { return e.Name + " not found" }

type PermError struct{}
func (e *PermError) Error() string { return "permission denied" }

func handle(err error) {
    switch e := err.(type) {
    case *NotFoundError: fmt.Println("missing:", e.Name)
    case *PermError:     fmt.Println("perm error")
    default:             fmt.Println("other:", e)
    }
}

func main() {
    handle(&NotFoundError{"user"})
    handle(errors.New("generic"))
}

การยืนยันเป็นอินเทอร์เฟซ

คุณสามารถยืนยันเป็นชนิดอินเทอร์เฟซอื่นได้ ไม่ใช่เฉพาะชนิดรูปธรรม เหมาะสำหรับตรวจสอบว่าออบเจ็กต์รองรับพฤติกรรมเสริมหรือไม่:

package main
import "fmt"

type Flusher interface{ Flush() }

type Writer interface{ Write(string) }

type BufferedWriter struct{ buf string }
func (b *BufferedWriter) Write(s string) { b.buf += s }
func (b *BufferedWriter) Flush()         { fmt.Println(b.buf); b.buf = "" }

func maybeFlush(w Writer) {
    if f, ok := w.(Flusher); ok { f.Flush() }
}

func main() {
    bw := &BufferedWriter{}
    bw.Write("hello")
    maybeFlush(bw)
}

การยืนยันอินเทอร์เฟซ nil

การยืนยันกับอินเทอร์เฟซ nil จะทำให้โปรแกรมหยุดทำงาน ควรตรวจสอบให้อินเทอร์เฟซไม่เป็น nil ก่อนยืนยันเสมอ:

package main
import "fmt"

func safePrint(i interface{}) {
    if i == nil {
        fmt.Println("nil")
        return
    }
    fmt.Printf("%T: %v\n", i, i)
}

func main() {
    safePrint(nil)
    safePrint(42)
}

ทางเลือกแทน reflect.TypeOf

หากต้องการพิมพ์ชนิดข้อมูลโดยไม่ยืนยันชนิด ให้ใช้ fmt.Sprintf("%T", v) หรือ reflect.TypeOf(v):

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

func main() {
    v := []int{1, 2, 3}
    fmt.Printf("%T\n", v)             // []int
    fmt.Println(reflect.TypeOf(v))    // []int
}

การยืนยันชนิดข้อมูลเทียบกับการแปลงชนิดข้อมูล

การยืนยันชนิดข้อมูล: ดึงชนิดข้อมูลรูปธรรมออกจากอินเทอร์เฟซ การแปลงชนิดข้อมูล: เปลี่ยนชนิดข้อมูลรูปธรรมหนึ่งชนิดเป็นอีกชนิดที่เข้ากันได้ ทั้งสองเป็นการดำเนินการคนละแบบ:

package main
import "fmt"

func main() {
    var i interface{} = int32(5)
    n := i.(int32)          // assertion — OK
    big := int64(n)         // conversion — OK
    fmt.Println(n, big)
}

รูปแบบค่าที่สองในคำสั่งเลือก

รูปแบบการตรวจสอบค่าที่สองยังใช้กับการรับค่าจากแชนเนลเพื่อระบุว่าแชนเนลถูกปิดแล้วได้ด้วย รูปแบบสำนวนกระชับเดียวกันนี้ใช้ใน Go อย่างสม่ำเสมอ

เมื่อใดควรใช้การสลับตามชนิดข้อมูล

กรณีการใช้งานที่พบบ่อย:

  • การถอดข้อมูล JSON ที่มีฟิลด์ interface{}
  • การจัดหมวดหมู่ข้อผิดพลาด
  • การส่งต่อข้อความโพรโทคอล
  • การตรวจสอบอินเทอร์เฟซที่มีให้เลือกใช้ (Flusher, Closer เป็นต้น)

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

ผลลัพธ์ของการยืนยันชนิดข้อมูลแบบไม่ปลอดภัยที่ชนิดไม่ตรงกันคืออะไร

สรุปทบทวน

ประเด็นสำคัญ:

  • x.(T) จะทำให้เกิดแพนิกเมื่อชนิดไม่ถูกต้อง ส่วน x, ok := x.(T) ปลอดภัย
  • การสลับตามชนิดข้อมูลช่วยจัดการหลายชนิดได้อย่างเป็นระเบียบ
  • ยืนยันเป็นอินเทอร์เฟซเพื่อตรวจสอบความสามารถเพิ่มเติมที่มีให้เลือกใช้
  • อย่ายืนยันกับอินเทอร์เฟซที่มีค่า nil

โจทย์ฝึกปฏิบัติ

เขียนฟังก์ชัน sum(values []any) float64 ที่ใช้การสลับตามชนิดข้อมูลเพื่อจัดการค่าชนิด int, float64 และ string (ให้แปลงข้อความเป็นค่า) โดยข้ามค่าอื่น ๆ

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

บทเรียน “การยืนยันชนิดข้อมูลและสวิตช์ชนิดข้อมูล” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การยืนยันชนิดข้อมูลและสวิตช์ชนิดข้อมูล”

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

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

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

บทเรียน “การยืนยันชนิดข้อมูลและสวิตช์ชนิดข้อมูล” ใช้เวลานานแค่ไหน

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

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

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

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

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