GOPATH และ workspace
$GOPATH
บทความนี้จะอธิบายให้คุณทราบถึงความเข้าใจว่า GOPATH มันคืออะไร มันทำงานอย่างไร และตั้งค่าอย่างไร นี่เป็นขั้นตอนสำคัญสำหรับการตั้งค่าสภาพแวดล้อมการพัฒนา Go รวมถึงการทำความเข้าใจวิธีที่ Go ค้นหา ติดตั้ง และสร้างไฟล์ต้นทาง ในบทความนี้ เราจะใช้ GOPATH เมื่อกล่าวถึงแนวคิดของโครงสร้างโฟลเดอร์ที่เราจะพูดถึง เราจะใช้ $GOPATH เพื่ออ้างถึงตัวแปรสภาพแวดล้อมที่ Go ใช้เพื่อค้นหาโครงสร้างโฟลเดอร์
ไปพื้นที่ทำงานเป็นวิธีการไปจัดการไฟล์ของเราแหล่งไบนารีรวบรวมและวัตถุที่เก็บไว้ชั่วคราวที่ใช้สำหรับการรวบรวมได้เร็วขึ้นในภายหลัง เป็นเรื่องปกติและยังแนะนำให้มี Go Workspace เพียงแห่งเดียว แม้ว่าจะเป็นไปได้ที่จะมีหลายช่องว่างก็ตาม GOPATH ทำหน้าที่เป็นโฟลเดอร์รากของพื้นที่ทำงาน
ข้อกำหนดเบื้องต้น
ข้อกำหนดเพียงอย่างเดียวสำหรับบทความนี้คือ คุณต้องติดตั้ง Go บนคอมพิวเตอร์ของคุณตามบทความ ติดตั้ง Go และ ทดสอบ Hello World และ คุณคุ้นเคยกับรูปแบบและโครงสร้างของมัน
ตั้งแต่ go เวอร์ชัน 1.8 ตัวแปรสภาพแวดล้อม GOPATH หากไม่ได้ตั้งค่าใหม่ จะมีค่าเริ่มต้นเป็น $HOME/go บน Unix และ %USERPROFILE%/go บน Windows
เราสามารถเปลี่ยนได้โดยการตั้งค่าตัวแปรสภาพแวดล้อม $GOPATH ได้ ตามขั้นตอนด้านล่าง
ตั้งค่าตัวแปรสภาพแวดล้อม $GOPATH ของ Windows ทำได้ดังนี้
ที่ช่องค้นหาพิมพ์คำว่า “env” แล้ว เลือก Edit the system environment variables
คลิกที่ Environment Variables…
หาคำว่า GOPATH ในคอม เช่น เครื่องนี้อยู่ C:\Users\%USERPROFILE%\go
ใน Windows คุณต้องสร้างตัวแปรสภาพแวดล้อมใหม่ที่เรียกว่า GOPATH จากนั้นตั้งค่าเป็น c:\mygo ( ค่านี้ขึ้นอยู่กับความต้องการตำแหน่งของพื้นที่ทำงานของคุณ )
โดยสามารถเปลี่ยน GOPATH ไปยังโฟลเดอร์ที่ต้องการด้วยการคลิกที่ Edit…
คลิก Browse Directory…
คลิก Make New Folder
ตัวอย่าง ไปที่ C: ตั้งชื่อโฟลเดอร์เป็น mygo -> OK
OK
ตอนนี้ GOPATH ได้ถูกเปลี่ยนเป็น C:\mygo แล้ว
การมีพาธ เวิร์กสเปซ Go (Go Workspace) มากกว่าหนึ่งพาธใน $GOPATH ป็นเรื่องปกติ แต่จำไว้ว่าคุณต้องใช้: ( ;ใน Windows) เพื่อแยกเส้นทาง ณ จุดนี้ go get จะบันทึกเนื้อหาไปยังเส้นทางแรกของคุณใน $GOPATH. ขอแนะนำเป็นอย่างยิ่งว่าอย่ามีหลายเวิร์กสเปซ
$GOPATH ไม่ใช่ $GOROOT
$GOROOT คือโค้ดไลบรารีมาตรฐานของคอมไพเลอร์ที่เตรียมไว้ให้ – คือไม่ใช่โค้ดของเรา โดย $GOROOT จะอยู่ที่ C:\Program Files\Go ส่วน $GOPATH ณ ตอนนี้อยู่ที่ C:\mygo
แม้ว่าเราจะไม่ต้องตั้งค่าตัวแปร $GOROOT โดยเฉพาะอีกต่อไป แต่ก็ยังคงอ้างอิงอยู่ในเวอร์ชันที่เก่ากว่า
โครงสร้างของ Go Workspace หรือพื้นที่ทำงาน ภาษา Go
ใน $GOPATH คุณต้องมีสามโฟลเดอร์ดังนี้:
- src สำหรับไฟล์ต้นทางที่มีนามสกุล .go, .c, .g, .s
- pkg สำหรับไฟล์ที่คอมไพล์แล้วซึ่งมีนามสกุล .a
- bin สำหรับไฟล์ปฏิบัติการ
ลองมาดูที่แต่ละไดเร็กทอรีเหล่านี้
$GOPATH/bin เป็นไดเรกทอรีสำหรับไฟล์ไบนารีที่คอมไพล์จากคำสั่ง go install ระบบปฏิบัติการของเราใช้ตัวแปรสภาพแวดล้อม $PATH ตัวแปรสภาพแวดล้อมเพื่อค้นหาแอปพลิเคชันไบนารีที่สามารถดำเนินการได้โดยไม่มีเส้นทางแบบเต็ม ขอแนะนำให้เพิ่มไดเร็กทอรีนี้ใน $PATH ตัวแปรส่วนกลางของเรา
ตัวอย่างเช่น หากเราไม่เพิ่ม $GOPATH/bin เพื่อให้ $PATH รันโปรแกรมจากที่นั่น เราจะต้องเรียกใช้:
$GOPATH/bin/myapp
เมื่อ $GOPATH/bin ถูกเพิ่มเข้าไปที่ $PATH เราสามารถเรียกใช้แบบนี้ได้:
myapp
ไดเรกทอรี $GOPATH/pkg เป็นที่เก็บรวบรวมไฟล์วัตถุเพื่อเพิ่มความเร็วในการรวบรวมของโปรแกรม โดยทั่วไปแล้ว นักพัฒนาส่วนใหญ่จะไม่จำเป็นต้องเข้าถึงไดเร็กทอรีนี้ หากคุณประสบปัญหาในการคอมไพล์ คุณสามารถลบไดเร็กทอรีนี้ได้อย่างปลอดภัย จากนั้น Go จะสร้างไดเร็กทอรีใหม่ให้
ไดเรกทอรี src เป็นที่สำหรับทุกของเราไฟล์ go หรือโค้ดที่จะต้องมาอยู่ ไม่ควรสับสนกับโค้ดไลบรารีมาตรฐา Go เตรียมไว้ให้ ซึ่งอยู่ที่ $GOROOT.
แพ็คเกจคืออะไร?
โค้ดไปถูกจัดระเบียบในแพ็คเกจ แพ็คเกจแสดงถึงไฟล์ทั้งหมดในไดเร็กทอรีเดียวบนดิสก์ หนึ่งไดเร็กทอรีสามารถมีไฟล์บางไฟล์จากแพ็คเกจเดียวกันเท่านั้น แพ็คเกจจะถูกเก็บไว้พร้อมกับไฟล์ต้นฉบับ Go ที่ผู้ใช้เขียนทั้งหมดภายใต้ไดเร็กทอรี $GOPATH/src เราสามารถเข้าใจการเรียกใช้งานของแพ็คเกจ โดยการนำเข้าแพ็คเกจที่แตกต่างกัน
หากโค้ดของเราใช้งานที่ $GOPATH/src/blue/red ชื่อแพ็คเกจควรเป็น red.
คำสั่งนำเข้าสำหรับแพ็คเกจ red ซึ่งเป็น แพ็คเกจที่เราสร้างขึ้นมาด้วยการเขียนโค้ดเอง จะเป็น:
import "blue/red"
แต่แพ็คเกจที่อยู่ในที่เก็บซอร์สโค้ด เช่น GitHub และ BitBucket มีตำแหน่งเต็มของที่เก็บซึ่งเป็นส่วนหนึ่งของเส้นทางการนำเข้า
ตัวอย่างเช่น เราจะนำเข้าซอร์สโค้ดที่ https://github.com/gobuffalo/buffalo ต้องใช้เส้นทางการนำเข้าต่อไปนี้:
import "github.com/gobuffalo/buffalo"
ดังนั้นซอร์สโค้ดนี้จะอยู่ในตำแหน่งต่อไปนี้บนดิสก์:
$GOPATH/src/github.com/gobuffalo/buffalo
ในบทความนี้ ฉันใช้ C:/mygo เป็นเส้นทางเดียว แทน $GOPATH
เปิดโปรแกรม VS Code ไปที่ File -> Open Folder…
ไปที่ $GOPATH คือ C:\mygo
สร้าง 3 โฟลเดอร์ คือ src , pkg และ bin
Module & Package directory
สร้างโฟลเดอร์โมดูล/โฟลเดอร์แพ็คเกจ/ไฟล์โก เช่น $GOPATH/src/mathapp/mymath/sqrt.go ( mathapp คือชื่อ โมดูล และ mymath คือชื่อแพ็คเกจ) โดยใช้ mymath เป็นชื่อแพ็คเกจ และ ชื่อโฟลเดอร์ที่ภายในมีไฟล์โค้ดของแพ็คเกจ )
ทุกครั้งที่คุณสร้าง โมดูล คุณควรสร้างโฟลเดอร์ใหม่ในไดเร็กทอรี src ยกเว้น main ซึ่ง main จะสร้างโฟลเดอร์หรือไม่ก็ได้ ชื่อโฟลเดอร์มักจะเหมือนกับ โมดูล ที่คุณจะใช้
คุณสามารถมี ไดเรกทอรีได้หลายระดับได้หากต้องการ ตัวอย่างเช่นถ้าคุณสร้างไดเรกทอรีเป็นเส้นทางแพคเกจเช่น $GOPATH/src/github.com/astaxie/beedb จากนั้นเส้นทางของแพ็คเกจจะเป็น github.com/astaxie/beedb ชื่อแพ็คเกจจะเป็นไดเร็กทอรีสุดท้ายในพาธของคุณ ซึ่งในกรณีนี้คือ beedb
สร้างโมดูล (module) แอปพลิเคชันใหม่ชื่อ mathapp ภายในโฟลเดอร์ src
โดยมีโครงสร้างดังนี้ $GOPATH/src/โมดูล/แพคเกจ/ไฟล์โก
สร้างไฟล์ go.mod
สร้างไฟล์ go.mod ภายในโฟลเดอร์โมดูล mathapp โดย Go Modules ที่เปิดตัวใน Go 1.11 มีเป้าหมายเพื่อแทนที่ Go Workspaces และ GOPATH การสร้างและเรียกใช้งานคำสั่ง เพื่อสร้างไฟล์ go.mod คือสิ่งที่สร้างขึ้นมาเพื่อจัดการ packages ต่างๆ สามารถกำหนดเวอร์ชั่นได้และมีการจัดการที่มีประสิทธิภาพมากขึ้นนั้นเอง และถ้าไม่มีไฟล์ go.mod จะไม่สามารถใช้คำสั่ง go build คอมไพล์ไฟล์ซอร์สโค้ดของเราได้
คลิกขวาที่ โฟลเดอร์ mathapp -> Open integrated Terminal
ใช้คำสั่ง
go mod init mathapp
จะได้ไฟล์ go.mod พร้อมโค้ดเบื้องต้นมาให้
สร้างโฟลเดอร์แพ็คเกจ ชื่อ mymath ภายในโฟลเดอร์โมดูล mathapp
สร้างไฟล์โกชื่อ sqrt.go ภายในโฟลเดอร์ mymath เขียนโค้ดต่อไปนี้ลงในไฟล์ของคุณ
package mymath
func Sqrt(x float64) float64 {
z := 0.0
for i := 0; i < 1000; i++ {
z -= (z*z - x) / (2 * x)
}
return z
}
ตอนนี้ไดเร็กทอรีแพ็คเกจของเราถูกสร้างขึ้นและมีการเขียนโค้ดแล้ว ฉันแนะนำให้คุณใช้ชื่อเดียวกันสำหรับแพ็คเกจของคุณ
เรียกใช้งาน แพ็คเกจ (packages)
เราได้สร้างแพ็คเกจของเราด้านบนแล้ว แต่เราจะรวบรวมมันเพื่อวัตถุประสงค์ในทางปฏิบัติได้อย่างไร แน่นอน เราจำเป็นต้องสร้างแอปพลิเคชันใหม่เพื่อใช้งาน แพ็คเกจ mymath โดยมีโครงสร้างการเข้าถึงแพ็คเกจ คือ import “โมดูล/แพ็คเกจ” หรือในตัวอย่างนี้คือ import “mathapp/mymath”
สร้างไฟล์โก main.go ภายในโฟลเดอร์ โมดูล mathapp และ เขียนโค้ดต่อไปนี้ไปที่ main.go
package main
import (
"mathapp/mymath"
"fmt"
)
func main() {
fmt.Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2))
}
ใช้คำสั่ง
go run main.go
ในการคอมไพล์แอปพลิเคชันนี้ คุณต้องสลับไปที่ไดเร็กทอรีของแอปพลิเคชัน ซึ่งในกรณีนี้คือ $GOPATH/src/mathapp จากนั้นรัน คำสั่ง go run main.go คุณควรเห็นเนื้อหาต่อไปนี้ในเทอร์มินัลของคุณ Hello world. Sqrt(2) = 1.414213562373095
บทสรุป
ในบทความนี้ เราได้กล่าวถึง GOPATH และสิ่งที่อยู่ภายใน (Go Workspace) เราได้พูดคุยถึงวิธีการเปลี่ยนตำแหน่งจากค่าเริ่มต้น C:/mygo เป็นตัวเลือกของผู้ใช้โดยการตั้งค่าตัวแปรสภาพแวดล้อม $GOPATH สุดท้าย เราได้พูดถึงวิธีที่ Go ค้นหาแพ็คเกจภายในโครงสร้างโฟลเดอร์นั้น
Go Modules ที่เปิดตัวใน Go 1.11 มีเป้าหมายเพื่อแทนที่ Go Workspaces และ GOPATH. แม้ว่าจะแนะนำให้เริ่มใช้โมดูล แต่สภาพแวดล้อมบางอย่าง เช่น สภาพแวดล้อมขององค์กร อาจไม่พร้อมใช้โมดูล
การตั้งค่า GOPATH ของ Go นั้น เป็นแง่มุมที่ยุ่งยากกว่าอีกประการหนึ่ง แต่เมื่อตั้งค่าครั้งแรกแล้ว ในการทำงานครั้งต่อไปก็ไม่จำเป็นที่ต้องมาตั้งค่า GOPATH อีกแล้ว เรามักจะลืมมันไปได้เลย