Go เป็นภาษาโปรแกรมที่น่าสนใจสำหรับการสร้างเว็บแอปพลิเคชันสมัยใหม่รวมถึงซอฟต์แวร์ระบบมันสร้างความฮือฮาอย่างมากหลังจากการเปิดตัวและขับเคลื่อนบริการต่างๆ เช่น Docker, Kubernetes, Terraform, Dropbox และNetflix
นอกจากนี้ คอลเลกชันแพ็คเกจในตัวที่แข็งแกร่งของ Go ทำให้เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการเขียนโปรแกรมเว็บ บทความนี้จะแสดงวิธีการเขียนเว็บเซิร์ฟเวอร์พื้นฐาน ใน Go
นำเข้าแพ็คเกจที่จำเป็น
แพ็คเกจ net/HTTP มอบทุกสิ่งที่จำเป็นในการสร้างเว็บเซิร์ฟเวอร์และไคลเอนต์ แพ็คเกจนี้นำเสนอฟังก์ชันที่มีประโยชน์ในการจัดการการเขียนโปรแกรมเว็บ
คุณสามารถนำเข้าได้โดยเพิ่มบรรทัดด้านล่างที่จุดเริ่มต้นของซอร์สโค้ดของคุณ:
import "net/http"
บทความนี้จะใช้ แพ็คเกจ fmtเพื่อจัดรูปแบบสตริงและ แพ็คเกจ บันทึกเพื่อจัดการกับข้อผิดพลาด คุณสามารถนำเข้าทีละรายการได้ตามที่แสดงด้านบน หรือนำเข้าแพ็คเกจทั้งหมดโดยใช้คำสั่งนำเข้าเดียว:
import (
"fmt"
"log"
"net/http"
)
คุณสามารถดำเนินการเขียนฟังก์ชันหลักได้หลังจากนำเข้าแพ็คเกจที่จำเป็นแล้ว ไปข้างหน้าและบันทึกไฟล์ต้นฉบับด้วย นามสกุล. goหากคุณใช้ Vim ให้ใช้คำสั่งด้านล่างเพื่อบันทึกและออกจาก Vim:
:wq server.go
เขียนฟังก์ชันหลัก
โปรแกรม Go อยู่ภายในฟังก์ชันหลักโดยตรง ซึ่งมีชื่อว่า "main" คุณจะต้องทำการ เรียกเซิร์ฟเวอร์ที่นี่ เพิ่มบรรทัดต่อไปนี้ลงในซอร์สโค้ดและดูว่ามันทำอะไร:
func main() {
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8080", nil))
}
ตัวอย่างคือการกำหนดฟังก์ชันหลักโดยใช้คีย์เวิร์ดfunc Go มีกฎที่เข้มงวดเกี่ยวกับตำแหน่งของเครื่องหมายปีกกาเปิด ดังนั้นตรวจสอบให้แน่ใจว่าเครื่องหมายปีกกาเริ่มต้นอยู่ในบรรทัดที่ถูกต้อง คำสั่งแรกใน main กำหนดว่าคำขอเว็บทั้งหมดไปยังรูทพาธ ( "/" ) จะได้รับการจัดการโดยดัชนี ซึ่งเป็นฟังก์ชันประเภทhttp.HandlerFunc
บรรทัดที่ สองเริ่มต้นเว็บเซิร์ฟเวอร์ผ่าน ฟังก์ชัน http.ListenAndServeโดยจะส่งสัญญาณให้เซิร์ฟเวอร์รับฟังคำขอ HTTP ขาเข้าบนพอร์ตของเซิร์ฟเวอร์ 8080 อย่างต่อเนื่อง จำเป็นต้องใช้พารามิเตอร์ตัวที่สองของฟังก์ชันนี้เพื่อบล็อกโปรแกรมจนจบ
เนื่องจากhttp.ListenAndServeส่งคืนข้อผิดพลาดเสมอ ตัวอย่างจึงล้อมการโทรนี้ไว้ภายในlog.Fatal callคำสั่งนี้จะบันทึกข้อความแสดงข้อผิดพลาดใดๆ ที่สร้างขึ้นบนฝั่งเซิร์ฟเวอร์
ใช้ฟังก์ชันการประมวลผล
อย่างที่คุณเห็น ฟังก์ชันหลักเรียกดัชนีฟังก์ชันตัวจัดการเพื่อจัดการคำขอของไคลเอ็นต์ อย่างไรก็ตาม ตัวอย่างยังไม่ได้กำหนดฟังก์ชันการทำงานนี้สำหรับเซิร์ฟเวอร์
มาเพิ่มคำสั่งที่จำเป็นเพื่อทำให้ฟังก์ชันดัชนีใช้งานได้:
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, welcome to %s!", r.URL.Path[1:])
}
ฟังก์ชันนี้รับอาร์กิวเมนต์ที่แตกต่างกันสองประเภทได้แก่http.ResponseWriterและhttp.Requestพารามิเตอร์http.ResponseWriterประกอบด้วยการตอบสนองของเซิร์ฟเวอร์ต่อคำขอที่เข้ามา ในรูปแบบของวัตถุhttp.Request
ฟังก์ชันFprintfจาก แพ็คเกจ fmtใช้เพื่อแสดงและจัดการสตริงข้อความ บทความนี้ใช้สิ่งนี้เพื่อแสดงการตอบสนองของเซิร์ฟเวอร์ต่อคำขอทางเว็บ สุดท้าย องค์ประกอบ r.URL.Path[1:]ใช้เพื่อดึงข้อมูลหลังจากเส้นทางราก
เพิ่มส่วนที่เหลือทั้งหมด
เว็บเซิร์ฟเวอร์ Go ของคุณจะพร้อมใช้งานเมื่อคุณเพิ่มส่วนประกอบที่เหลือทั้งหมดแล้ว รหัสจะมีลักษณะดังนี้:
import (
"fmt"
"log"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, welcome to %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8080", nil))
}
จำเป็นต้องมีบรรทัดแรกเพื่อคอมไพล์โค้ดเว็บเซิร์ฟเวอร์ Go นี้เป็นไฟล์ปฏิบัติการ
คอมไพล์โค้ดเว็บเซิร์ฟเวอร์ Go นี้เป็นไฟล์ปฏิบัติการ