0Pricing
Go Academy · บทเรียน

สไลซ์: รายการแบบไดนามิก

make, append, copy, len และ cap

สไลซ์: รายการแบบไดนามิก เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

สไลซ์คืออะไร

สไลซ์คือมุมมองที่มีขนาดเปลี่ยนแปลงได้ของอาร์เรย์ที่อยู่เบื้องหลัง สไลซ์มีองค์ประกอบสามอย่าง ได้แก่ พอยน์เตอร์ไปยังอาร์เรย์ ความยาว และความจุ

  • สไลซ์เป็นชนิดข้อมูลแบบอ้างอิง สไลซ์หลายตัวสามารถใช้อาร์เรย์รองรับชุดเดียวกันได้
  • งานที่มีลักษณะเหมือนรายการใน Go ส่วนใหญ่ใช้สไลซ์ ไม่ใช่อาร์เรย์

ลิเทอรัลสไลซ์และ make

สร้างสไลซ์ด้วยลิเทอรัลหรือ make:

package main
import "fmt"

func main() {
    nums := []int{1, 2, 3, 4, 5}      // literal
    strs := make([]string, 3)          // len=3, cap=3, zero values
    buf  := make([]byte, 0, 64)        // len=0, cap=64
    fmt.Println(nums, strs, len(buf), cap(buf))
}

len และ cap

len คืนค่าจำนวนสมาชิกปัจจุบันในสไลซ์ ส่วน cap คืนค่าความจุของอาร์เรย์เบื้องหลัง โดยเริ่มนับจากพอยน์เตอร์เริ่มต้นของสไลซ์

package main
import "fmt"

func main() {
    s := make([]int, 3, 8)
    fmt.Println(len(s)) // 3
    fmt.Println(cap(s)) // 8
}

append: การขยายสไลซ์

append เพิ่มสมาชิกให้สไลซ์ และจะจัดสรรอาร์เรย์เบื้องหลังชุดใหม่เมื่อเกินความจุ:

package main
import "fmt"

func main() {
    s := []int{1, 2, 3}
    s = append(s, 4, 5)
    s = append(s, []int{6, 7, 8}...)
    fmt.Println(s) // [1 2 3 4 5 6 7 8]
}

การตัดสไลซ์

ใช้ไวยากรณ์ [low:high] เพื่อสร้างสไลซ์ย่อย ซึ่งใช้อาร์เรย์เบื้องหลังร่วมกัน:

package main
import "fmt"

func main() {
    a := []int{0, 1, 2, 3, 4, 5}
    b := a[1:4]   // [1 2 3]
    c := a[:3]    // [0 1 2]
    d := a[3:]    // [3 4 5]
    fmt.Println(b, c, d)
}

copy: สไลซ์ที่เป็นอิสระต่อกัน

copy คัดลอกสมาชิกระหว่างสไลซ์และคืนค่าจำนวนสมาชิกที่คัดลอก โดยปลายทางและต้นทางจะไม่ใช้หน่วยความจำร่วมกัน:

package main
import "fmt"

func main() {
    src := []int{1, 2, 3}
    dst := make([]int, len(src))
    n := copy(dst, src)
    dst[0] = 99
    fmt.Println(src, dst, n) // [1 2 3] [99 2 3] 3
}

สไลซ์ nil เทียบกับสไลซ์ว่าง

สไลซ์ nil ไม่มีอาร์เรย์เบื้องหลัง ส่วนสไลซ์ว่างมีอาร์เรย์เบื้องหลังแต่มีความยาวเป็น 0 ทั้งสองแบบมี len == 0:

package main
import "fmt"

func main() {
    var nilSlice []int
    emptySlice  := []int{}
    fmt.Println(nilSlice  == nil) // true
    fmt.Println(emptySlice == nil) // false
    fmt.Println(len(nilSlice), len(emptySlice)) // 0 0
    nilSlice = append(nilSlice, 1) // safe!
}

การลบสมาชิก

Go ไม่มีฟังก์ชันในตัวสำหรับลบสมาชิกจากสไลซ์ วิธีตามสำนวนของภาษาคือใช้ append:

package main
import "fmt"

func main() {
    s := []int{1, 2, 3, 4, 5}
    i := 2 // delete index 2
    s = append(s[:i], s[i+1:]...)
    fmt.Println(s) // [1 2 4 5]
}

การแทรกสมาชิก

แทรกที่ตำแหน่ง i โดยใช้ append ร่วมกับการตัดสไลซ์:

package main
import "fmt"

func main() {
    s := []int{1, 2, 4, 5}
    i := 2
    s = append(s[:i+1], s[i:]...)
    s[i] = 3
    fmt.Println(s) // [1 2 3 4 5]
}

ข้อควรระวังของสไลซ์: อาร์เรย์เบื้องหลังที่ใช้ร่วมกัน

สไลซ์ย่อยใช้อาร์เรย์เบื้องหลังร่วมกัน การแก้ไขสไลซ์หนึ่งจึงส่งผลต่ออีกสไลซ์จนกว่าจะมีการจัดสรรใหม่:

package main
import "fmt"

func main() {
    a := []int{1, 2, 3, 4}
    b := a[:2]   // shares backing array
    b[0] = 99
    fmt.Println(a) // [99 2 3 4] — a is changed!
}

ตรวจสอบความเข้าใจ

append คืนค่าอะไร

สรุป: สไลซ์

ประเด็นสำคัญ:

  • สไลซ์ = พอยน์เตอร์ + len + cap โดยสไลซ์ครอบอาร์เรย์ไว้
  • ใช้ make เพื่อจัดสรรความจุไว้ล่วงหน้า
  • กำหนดผลลัพธ์ของ append ให้ตัวแปรเสมอ
  • copy สร้างสไลซ์ที่เป็นอิสระต่อกัน
  • ระวังอาร์เรย์เบื้องหลังที่ใช้ร่วมกันเมื่อทำงานกับสไลซ์ย่อย

โจทย์ฝึกปฏิบัติ

สร้างสไลซ์จำนวนเต็ม 5 ค่าด้วย make เพิ่มค่าอีกสามค่า จากนั้นคัดลอกไปยังสไลซ์ใหม่และแก้ไขสำเนาโดยไม่ให้กระทบต้นฉบับ พิมพ์สไลซ์ทั้งสองตัว

คำถามที่พบบ่อย

บทเรียน “สไลซ์: รายการแบบไดนามิก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “สไลซ์: รายการแบบไดนามิก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “สไลซ์: รายการแบบไดนามิก”

make, append, copy, len และ cap คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “สไลซ์: รายการแบบไดนามิก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. อาร์เรย์: คอลเลกชันความยาวคงที่
  2. สไลซ์: รายการแบบไดนามิก
  3. แมป: ที่เก็บคู่คีย์-ค่า
  4. วนซ้ำคอลเลกชันด้วย range
← กลับไปที่ Go Academy