Go Academy · บทเรียน

แพ็กเกจภายในและพื้นที่ทำงาน

internal/ คำสั่ง replace และ go work

บทเรียน 4 จาก 412 ขั้นตอน

แพ็กเกจภายในและพื้นที่ทำงาน เป็นบทเรียน 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 directives

go 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. แพ็กเกจ: การจัดระเบียบโค้ด Go
  2. โมดูล Go ด้วย go mod
  3. การเพิ่มดีเพนเดนซีภายนอก
  4. แพ็กเกจภายในและพื้นที่ทำงาน
← กลับไปที่ Go Academy