แพ็กเกจภายในและพื้นที่ทำงาน
internal/ คำสั่ง replace และ go work
แพ็กเกจภายในและพื้นที่ทำงาน เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
ไดเรกทอรี internal/
แพ็กเกจภายในไดเรกทอรี internal/ สามารถนำเข้าได้เฉพาะโค้ดในลำดับชั้นไดเรกทอรีแม่เท่านั้น ซึ่งช่วยบังคับใช้การห่อหุ้มแพ็กเกจ:
// Project structure:
// myapp/
// main.go
// internal/
// auth/auth.go <- can only be imported by myapp/
// db/db.go <- can only be imported by myapp/
// api/
// handlers.go <- can import myapp/internal/auth
// External package CANNOT do:
// import "myapp/internal/auth" <- compile errorการใช้แพ็กเกจ internal/
โค้ดภายในโมดูลเดียวกัน (ที่อยู่เหนือไดเรกทอรี internal/) สามารถนำเข้าแพ็กเกจภายในได้อย่างอิสระ:
// myapp/api/handlers.go
package api
import (
"myapp/internal/auth"
"myapp/internal/db"
)
func GetUser(id int) (*db.User, error) {
if !auth.IsValid() {
return nil, auth.ErrUnauthorized
}
return db.FindUser(id)
}เหตุใดจึงใช้ internal/
ประโยชน์ของแนวทางการใช้ internal/:
- ป้องกันไม่ให้โมดูลอื่นพึ่งพารายละเอียดการทำงานภายใน
- ช่วยให้ปรับโครงสร้างโค้ดได้อย่างอิสระโดยไม่ทำให้ผู้เรียกจากภายนอกเสียหาย
- เป็นสัญญาณที่ชัดเจนว่าส่วนนี้ไม่ใช่ส่วนหนึ่งของส่วนติดต่อโปรแกรมสาธารณะ
- เครื่องมือมาตรฐานของ Go บังคับใช้ข้อจำกัดนี้ขณะคอมไพล์
พื้นที่ทำงาน Go — go work
Go 1.18 เปิดตัวพื้นที่ทำงานสำหรับทำงานกับหลายโมดูลภายในเครื่องพร้อมกัน โดยไม่ต้องใช้คำสั่ง replace:
# Create a workspace in parent directory:
go work init ./myapp ./mylib
# Creates go.work:
# go 1.21
# use (
# ./myapp
# ./mylib
# )
# Now myapp can import mylib without replace directivesgo work sync
ซิงค์การพึ่งพาของพื้นที่ทำงานด้วย go work sync:
# go.work file:
go 1.21
use (
./api
./worker
./shared
)
# Sync all module dependencies:
go work sync
# Build across all workspace modules:
go build ./...
# Test across all workspace modules:
go test ./...พื้นที่ทำงานเทียบกับคำสั่ง replace
การเปรียบเทียบสองแนวทางสำหรับการพัฒนาหลายโมดูลภายในเครื่อง:
// BEFORE workspaces (cumbersome):
// go.mod in myapp:
// replace github.com/me/mylib => ../mylib
// Must remove before publishing!
// WITH workspaces (cleaner):
// go.work at root:
// use (./myapp ./mylib)
// go.mod files stay clean — go.work is gitignoredกรณีการใช้พื้นที่ทำงาน
ควรใช้พื้นที่ทำงาน Go เมื่อ:
- กำลังพัฒนาไลบรารีและโปรแกรมที่ใช้ไลบรารีนั้นพร้อมกัน
- มีที่เก็บโค้ดเดียวที่มีหลายโมดูลอ้างอิงถึงกัน
- กำลังทดสอบการเปลี่ยนแปลงของโมดูลที่ใช้ร่วมกันก่อนเผยแพร่
- กำลังทำงานกับสาขาแยกของการพึ่งพาควบคู่ไปกับแอปพลิเคชัน
go work add และ go work use
จัดการรายการในพื้นที่ทำงานด้วยคำสั่งย่อยของ go work:
# Add a module to the workspace
go work use ./newservice
# Remove a module from workspace
go work use -r ./oldservice
# Edit go.work directly (opens $EDITOR):
go work edit
# go.work should usually be gitignored:
echo "go.work" >> .gitignore
echo "go.work.sum" >> .gitignoreการใช้ Internal และพื้นที่ทำงานร่วมกัน
แพ็กเกจภายในและพื้นที่ทำงานสามารถทำงานร่วมกันได้อย่างเป็นธรรมชาติในที่เก็บโค้ดเดียว:
// Monorepo structure:
// services/
// go.work
// auth-service/
// internal/tokens/ <- private to auth-service
// order-service/
// internal/pricing/ <- private to order-service
// shared/
// models/ <- shared across services
// go.work:
// use (./auth-service ./order-service ./shared)แนวทางปฏิบัติที่ดีในการจัดระเบียบแพ็กเกจ
คำแนะนำเกี่ยวกับโครงสร้างโครงการ Go:
- ใช้โครงสร้างแพ็กเกจแบบแบนสำหรับโครงการขนาดเล็ก — อย่าจัดระเบียบล่วงหน้าโดยไม่จำเป็น
- ใช้
internal/สำหรับรายละเอียดการทำงานภายในที่ไม่ต้องการให้ภายนอกใช้ - วางแพ็กเกจ main ของส่วนติดต่อบรรทัดคำสั่งไว้ใต้
cmd/appname/ - ใช้พื้นที่ทำงานสำหรับที่เก็บโค้ดหลายโมดูล แต่เพิ่ม
go.workในรายการที่ไม่ต้องติดตามด้วย git - หลีกเลี่ยงการซ้อนลึก — แพ็กเกจควรมีความลึกไม่เกิน 3–4 ระดับ
ตรวจสอบอย่างรวดเร็ว
ใครสามารถนำเข้าแพ็กเกจในไดเรกทอรี internal/ ได้บ้าง
ทบทวน: แพ็กเกจภายในและพื้นที่ทำงาน
สรุป:
internal/จำกัดการนำเข้าไว้ที่ลำดับชั้นไดเรกทอรีแม่ โดยคอมไพเลอร์จะบังคับใช้- ใช้
internal/เพื่อซ่อนรายละเอียดการทำงานภายในจากผู้ใช้ภายนอก go work initสร้างพื้นที่ทำงานสำหรับการพัฒนาหลายโมดูลภายในเครื่อง- พื้นที่ทำงานใช้แทนคำสั่ง
replaceสำหรับการพัฒนาในเครื่อง - เพิ่ม
go.workและgo.work.sumในรายการที่ไม่ต้องติดตามด้วย git
เรียนรู้ Go ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 51
- บทเรียน
- 203
คำถามที่พบบ่อย
บทเรียน “แพ็กเกจภายในและพื้นที่ทำงาน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “แพ็กเกจภายในและพื้นที่ทำงาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “แพ็กเกจภายในและพื้นที่ทำงาน”
internal/ คำสั่ง replace และ go work คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “แพ็กเกจภายในและพื้นที่ทำงาน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แพ็กเกจ: การจัดระเบียบโค้ด Go
- โมดูล Go ด้วย go mod
- การเพิ่มดีเพนเดนซีภายนอก
- แพ็กเกจภายในและพื้นที่ทำงาน