การยืนยันชนิดข้อมูลและสวิตช์ชนิดข้อมูล
การยืนยันชนิดข้อมูลอย่างปลอดภัยและรูปแบบการใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดและใช้งาน interface
- interface ของไลบรารีมาตรฐานหลัก
- การยืนยันชนิดข้อมูลและสวิตช์ชนิดข้อมูล
- การประกอบ interface และแนวทางปฏิบัติที่ดี