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