สไลซ์: รายการแบบไดนามิก
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อาร์เรย์: คอลเลกชันความยาวคงที่
- สไลซ์: รายการแบบไดนามิก
- แมป: ที่เก็บคู่คีย์-ค่า
- วนซ้ำคอลเลกชันด้วย range