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

การผูกกับสตรักต์

แปลงการกำหนดค่ากลับจากข้อมูล

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

จากคีย์กระจัดกระจายสู่โครงสร้าง

การเรียก GetString ในทุกจุดทำให้คีย์สตริงกระจายอยู่ทั่วโค้ด การแปลงการกำหนดค่าเป็นโครงสร้างที่มีชนิดข้อมูลช่วยให้ชื่อฟิลด์ได้รับการตรวจสอบขณะคอมไพล์ และทำให้เห็นโครงสร้างทั้งหมดได้ในที่เดียว

การกำหนดโครงสร้างการกำหนดค่า

ประกาศโครงสร้างที่มีฟิลด์ติดแท็ก mapstructure เพื่อให้ Viper ทราบว่าคีย์การกำหนดค่าใดจับคู่กับฟิลด์ใด แต่ละฟิลด์จะตามด้วยแท็ก เช่น mapstructure:"host" ซึ่งในซอร์ส Go จริงจะเขียนไว้ระหว่างเครื่องหมาย backquote

type ServerConfig struct {
    Host string // tag: mapstructure host
    Port int    // tag: mapstructure port
}

type Config struct {
    Server ServerConfig // tag: mapstructure server
    Debug  bool         // tag: mapstructure debug
}

การเรียก Unmarshal

หลังจากอ่านการกำหนดค่าแล้ว ให้ถอดรหัสลงในโครงสร้างของคุณ:

var cfg Config
if err := viper.Unmarshal(&cfg); err != nil {
    log.Fatalf("unable to decode config: %v", err)
}
fmt.Println(cfg.Server.Port)

เหตุใดจึงใช้ mapstructure ไม่ใช่ json

Viper ใช้ไลบรารี mapstructure เนื่องจากการกำหนดค่าอาจมาจากหลายรูปแบบ (YAML ตัวแปรสภาพแวดล้อม TOML) ไม่ใช่แค่ JSON แท็ก mapstructure ไม่ขึ้นกับรูปแบบ และถอดรหัสจากแผนที่ทั่วไป

การถอดรหัสโครงสร้างย่อยรายการเดียว

คุณสามารถถอดรหัสเฉพาะส่วนหนึ่งได้ด้วย UnmarshalKey:

var sc ServerConfig
viper.UnmarshalKey("server", &sc)
fmt.Println(sc.Host, sc.Port)

ฟิลด์แบบซ้อนกันและแบบสไลซ์

mapstructure จัดการโครงสร้างที่ซ้อนกันและสไลซ์ให้โดยอัตโนมัติ:

  • โครงสร้างที่ซ้อนกันจะจับคู่กับส่วนการกำหนดค่าที่ซ้อนกัน
  • ฟิลด์ []string จะจับคู่กับอาร์เรย์ YAML/JSON

ฟิลด์แบบสไลซ์จะมีแท็ก mapstructure:"hosts" ซึ่งในซอร์สจริงจะเขียนไว้ระหว่างเครื่องหมาย backquote

type Config struct {
    Hosts []string // tag: mapstructure hosts
}

ค่าเริ่มต้นของฟิลด์

หากไม่มีคีย์และคุณไม่ได้กำหนดค่าเริ่มต้น ฟิลด์จะใช้ค่าศูนย์ของ Go (0 สตริงว่าง false) ใช้การผูกโครงสร้างร่วมกับ SetDefault เพื่อรับประกันค่าที่เหมาะสม

การตรวจสอบโครงสร้างที่ถอดรหัสแล้ว

หลังจากถอดรหัสแล้ว ให้ตรวจสอบความถูกต้อง รูปแบบที่ใช้กันทั่วไปคือเมธอด Validate() ที่คืนค่าข้อผิดพลาดสำหรับชุดค่าที่เป็นไปไม่ได้ (พอร์ต 0 โฮสต์ว่าง)

func (c Config) Validate() error {
    if c.Server.Port == 0 {
        return fmt.Errorf("server.port is required")
    }
    return nil
}

ข้อผิดพลาดในการถอดรหัสมีชนิดข้อมูล

หากค่าไม่สามารถใส่ลงในชนิดข้อมูลของฟิลด์ได้ (เช่น สตริงในตำแหน่งที่คาดว่าจะเป็น int) การถอดรหัสจะส่งคืนข้อผิดพลาดที่ระบุฟิลด์นั้น โปรดตรวจสอบและแสดงข้อผิดพลาดดังกล่าวเสมอ แทนที่จะเพิกเฉย

แนวคิดเดียวกันด้วย encoding/json

ไลบรารีมาตรฐานสามารถถอดรหัส JSON ได้ในลักษณะเดียวกัน เมื่อใช้แท็กของโครงสร้างอย่างชัดเจน ระบบจะเติมค่าลงในฟิลด์ที่มีชนิดข้อมูลกำกับ ส่วนการใช้แมปจะให้คุณเข้าถึงข้อมูลแบบทั่วไป โปรแกรมที่เรียกใช้ได้ด้านล่างใช้แมปซ้อนกัน เพื่อให้ผู้เรียนเรียกใช้ได้โดยไม่ต้องใช้แท็กของโครงสร้าง

เรียกใช้ได้: ถอดรหัสการตั้งค่าที่ซ้อนกัน

โปรแกรมที่ทำงานได้ในตัวนี้จะถอดรหัส JSON การตั้งค่าที่ซ้อนกันลงในแมปทั่วไป แล้วอ่านฟิลด์ที่ซ้อนกัน ซึ่งทำงานเลียนแบบวิธีที่ Unmarshal เติมค่าลงในโครงสร้าง

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := "{\"server\":{\"host\":\"localhost\",\"port\":8080},\"debug\":true}"
    var c map[string]any
    if err := json.Unmarshal([]byte(raw), &c); err != nil {
        panic(err)
    }
    srv := c["server"].(map[string]any)
    fmt.Printf("%v:%v debug=%v\n", srv["host"], srv["port"], c["debug"])
}

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

ทดสอบความเข้าใจของคุณเกี่ยวกับการผูกการตั้งค่าเข้ากับโครงสร้าง

สรุป

คุณได้เรียนรู้การผูกการตั้งค่าเข้ากับโครงสร้าง:

  • ใช้แท็ก mapstructure และ viper.Unmarshal(&cfg)
  • UnmarshalKey จะถอดรหัสโครงสร้างย่อยเพียงส่วนเดียว
  • โครงสร้างซ้อนกันและสไลซ์จะถูกถอดรหัสโดยอัตโนมัติ
  • เพิ่มเมธอด Validate() เพื่อตรวจจับการตั้งค่าที่ไม่ถูกต้องตั้งแต่เนิ่น ๆ

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

บทเรียน “การผูกกับสตรักต์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การผูกกับสตรักต์”

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

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

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

บทเรียน “การผูกกับสตรักต์” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การอ่านไฟล์การกำหนดค่า
  2. ตัวแปรสภาพแวดล้อม
  3. ค่าเริ่มต้นและการเฝ้าดู
  4. การผูกกับสตรักต์
← กลับไปที่ Go Academy