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

ตัวแปรสภาพแวดล้อม

แทนที่การกำหนดค่าจากสภาพแวดล้อม

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

เหตุใดจึงใช้ตัวแปรสภาพแวดล้อม

แนวทาง Twelve-Factor App แนะนำให้จัดเก็บการกำหนดค่าไว้ในสภาพแวดล้อม ตัวแปรสภาพแวดล้อมช่วยให้ไบนารีเดียวกันทำงานแตกต่างกันได้ในสภาพแวดล้อมการพัฒนา การทดสอบก่อนใช้งาน และการใช้งานจริง โดยไม่ต้องแก้ไขไฟล์

Viper สามารถซ้อนตัวแปรสภาพแวดล้อมไว้เหนือการกำหนดค่าจากไฟล์ได้

ลำดับความสำคัญ

Viper จะหาค่าคีย์โดยตรวจสอบแหล่งข้อมูลตามลำดับความสำคัญ (จากสูงสุดก่อน):

  • การเรียก Set โดยตรง
  • แฟล็ก
  • ตัวแปรสภาพแวดล้อม
  • ไฟล์การกำหนดค่า
  • ค่าเริ่มต้น

ดังนั้นตัวแปรสภาพแวดล้อมจะแทนที่ค่าในไฟล์ แต่มีลำดับความสำคัญต่ำกว่าการเรียก Set โดยตรง

การเปิดใช้การรองรับตัวแปรสภาพแวดล้อม

viper.AutomaticEnv() บอกให้ Viper ตรวจสอบตัวแปรสภาพแวดล้อมสำหรับคีย์ทุกตัวที่คุณขอ หลังจากนั้น viper.GetString("port") จะตรวจดูตัวแปรสภาพแวดล้อม PORT

viper.AutomaticEnv()
port := viper.GetString("port")

การเพิ่มคำนำหน้า

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

  • viper.SetEnvPrefix("myapp")
  • จากนั้นคีย์ port จะจับคู่กับตัวแปรสภาพแวดล้อม MYAPP_PORT

Viper จะเปลี่ยนคีย์เป็นตัวพิมพ์ใหญ่ แล้วเติมคำนำหน้าตามด้วยขีดล่าง

viper.SetEnvPrefix("myapp")
viper.AutomaticEnv()
fmt.Println(viper.GetString("port")) // reads MYAPP_PORT

การจัดการคีย์ที่ซ้อนกัน

ตัวแปรสภาพแวดล้อมมีจุดอยู่ในชื่อไม่ได้ ให้ใช้ตัวแทนที่แทนที่คีย์เพื่อแปลงคีย์ที่มีจุดเป็นขีดล่าง ดังนั้น server.port จึงกลายเป็น SERVER_PORT

replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
viper.AutomaticEnv()
// server.port -> SERVER_PORT

การผูกตัวแปรรายการเดียว

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

viper.BindEnv("id", "ACCOUNT_ID")
fmt.Println(viper.GetString("id"))

แพ็กเกจ os ของไลบรารีมาตรฐาน

เบื้องหลัง การทำงานนี้จะอ่านจากสภาพแวดล้อมของกระบวนการ ซึ่งไลบรารีมาตรฐานเปิดให้ใช้ผ่าน os.Getenv และ os.LookupEnv

  • os.Getenv จะคืนค่าสตริงว่างหากไม่ได้กำหนดค่า
  • os.LookupEnv จะคืนค่าบูลีนตัวที่สองเพื่อบอกว่าตัวแปรนั้นมีอยู่หรือไม่
val, ok := os.LookupEnv("PORT")
if !ok {
    val = "8080" // default
}

การกำหนดตัวแปรสภาพแวดล้อมใน Go

คุณสามารถกำหนดตัวแปรสภาพแวดล้อมด้วยโปรแกรมสำหรับการทดสอบหรือค่าเริ่มต้นได้ด้วย os.Setenv นี่คือสิ่งที่เราใช้เพื่อสาธิตพฤติกรรมการแทนที่ในลำดับถัดไป

os.Setenv("MYAPP_PORT", "9090")

ค่าว่างกับไม่ได้กำหนดค่า

โปรดระวัง: ตัวแปรสภาพแวดล้อมที่กำหนดเป็นสตริงว่างก็ยังถือว่ามีอยู่ os.LookupEnv จะคืนค่า ("", true) หากคุณใช้เพียง os.Getenv คุณจะไม่สามารถแยกความแตกต่างระหว่างค่าว่างกับการไม่ได้กำหนดค่าได้ ซึ่งมีความสำคัญสำหรับแฟล็กที่มีลักษณะเหมือนค่าบูลีน

os.Setenv("FEATURE", "")
v, ok := os.LookupEnv("FEATURE")
fmt.Println(v == "", ok) // true true

การนำมารวมกัน (แนวคิด)

ลำดับการเริ่มต้นโดยทั่วไปคือ อ่านไฟล์เพื่อรับค่าเริ่มต้น จากนั้นเรียก AutomaticEnv เพื่อให้ตัวแปรสภาพแวดล้อมของการนำไปใช้งานมีลำดับความสำคัญสูงกว่า ทีมปฏิบัติการสามารถเปลี่ยน MYAPP_PORT ได้โดยไม่ต้องแตะต้อง YAML

viper.SetConfigName("config")
viper.ReadInConfig()
viper.SetEnvPrefix("myapp")
viper.AutomaticEnv()
fmt.Println(viper.GetInt("port"))

รันได้: การสาธิตการแทนที่ด้วยตัวแปรสภาพแวดล้อม

โปรแกรมที่ใช้ไลบรารีมาตรฐานนี้เลียนแบบลำดับความสำคัญของ Viper: ค่าเริ่มต้นจากไฟล์จะถูกแทนที่ด้วยค่าจากสภาพแวดล้อม

package main

import (
    "fmt"
    "os"
)

func get(key, fileDefault string) string {
    if v, ok := os.LookupEnv(key); ok {
        return v
    }
    return fileDefault
}

func main() {
    os.Setenv("PORT", "9090")
    fmt.Println("port:", get("PORT", "8080"))
    fmt.Println("host:", get("HOST", "localhost"))
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับการกำหนดค่าด้วยตัวแปรสภาพแวดล้อม

สรุปทบทวน

คุณได้เรียนรู้วิธีแทนที่การกำหนดค่าจากสภาพแวดล้อม:

  • ตัวแปรสภาพแวดล้อมมีลำดับความสำคัญสูงใน Viper โดยอยู่เหนือไฟล์
  • AutomaticEnv + SetEnvPrefix จะแปลงคีย์เป็น PREFIX_KEY
  • ใช้ SetEnvKeyReplacer สำหรับคีย์ที่ซ้อนกันและมีจุด
  • ไลบรารีมาตรฐานรองรับการทำงานนี้ด้วย os.Getenv / os.LookupEnv

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

บทเรียน “ตัวแปรสภาพแวดล้อม” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ตัวแปรสภาพแวดล้อม”

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

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

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

บทเรียน “ตัวแปรสภาพแวดล้อม” ใช้เวลานานแค่ไหน

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

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

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

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

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