Zig Academy · บทเรียน

สไลซ์: พอยน์เตอร์บวกความยาว

อ้างอิงช่วงหนึ่งภายในอาร์เรย์

บทเรียน 2 จาก 413 ขั้นตอน

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

เหตุผลที่มีสไลซ์

อาร์เรย์มีความยาวคงที่ แต่ฟังก์ชันมักต้องทำงานกับข้อมูลที่มีความยาวเท่าใดก็ได้ สไลซ์แก้ปัญหานี้ด้วยการอธิบายลำดับสมาชิกที่ยืดหยุ่น 🔪

ข้อมูลสองส่วน

สไลซ์ประกอบด้วยสองสิ่งที่รวมเข้าด้วยกัน ได้แก่พอยน์เตอร์ไปยังสมาชิกแรก และความยาวที่นับจำนวนสมาชิกถัดไป

ชนิดสไลซ์

เขียนชนิดสไลซ์เป็น []T โดยใช้วงเล็บเหลี่ยมเปล่าตามด้วยชนิดสมาชิก []i32 หมายถึงสไลซ์ของจำนวนเต็มมีเครื่องหมาย

var view: []i32 = undefined;

สไลซ์ยืมข้อมูล ไม่ได้เป็นเจ้าของ

สไลซ์ไม่ได้เป็นเจ้าของหน่วยความจำ แต่ยืมมุมมองเข้าไปยังสิ่งอื่น ซึ่งโดยทั่วไปคืออาร์เรย์ ข้อมูลต้นทางต้องมีอายุยืนยาวกว่าสไลซ์

ความยาวอยู่ขณะรัน

ต่างจากอาร์เรย์ตรงที่ len ของสไลซ์เป็นค่าขณะรัน นี่เองที่ทำให้ชนิดสไลซ์หนึ่งชนิดรองรับขนาดที่แตกต่างกันได้มากมาย

const n = view.len;

จากอาร์เรย์เป็นสไลซ์

เปลี่ยนอาร์เรย์ทั้งชุดเป็นสไลซ์ด้วย [0..] ซึ่งหมายถึงตั้งแต่ดัชนีศูนย์จนถึงท้ายอาร์เรย์ ตอนนี้สไลซ์จะชี้เข้าไปในอาร์เรย์นั้น

var data = [_]i32{ 5, 6, 7 };
const s = data[0..];

การใช้ดัชนีกับสไลซ์

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

const middle = s[1];

สไลซ์แบบอ่านอย่างเดียว

[]const u8 คือสไลซ์ที่คุณอ่านได้แต่เขียนผ่านสไลซ์ไม่ได้ const จะปกป้องข้อมูลที่ยืมมาไม่ให้ถูกเปลี่ยนโดยไม่ตั้งใจ

const msg: []const u8 = "hi";

การส่งสไลซ์มีต้นทุนต่ำ

การส่งสไลซ์ให้ฟังก์ชันจะคัดลอกเพียงพอยน์เตอร์และความยาว ไม่คัดลอกสมาชิก ข้อมูลบัฟเฟอร์ขนาดใหญ่จึงส่งต่อได้โดยไม่มีต้นทุนเพิ่มเติม

fn sum(items: []const i32) i32 {
    // walk items here
}

สไลซ์ยังคงตรวจสอบขอบเขต

เนื่องจาก slice ทราบความยาวของตัวเอง การเข้าถึงด้วยดัชนีจึงยังคงมีการตรวจสอบขอบเขตอยู่ การเข้าถึงเกิน len จะทำให้เกิด panic เพื่อความปลอดภัยในบิลด์แบบปลอดภัย

Slice ว่างก็ใช้งานได้

slice สามารถเก็บสมาชิกได้ศูนย์ตัว slice ที่ว่างจะมีค่า len เท่ากับ 0 ซึ่งเป็นเรื่องปกติและส่งต่อไปใช้งานได้

const nothing: []const i32 = &[_]i32{};

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ลองคิดดูว่า slice เก็บอะไรไว้จริง ๆ เมื่อเทียบกับอาร์เรย์ขนาดตายตัว คู่ใดอธิบายได้ถูกต้อง

สรุปทบทวน

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

เริ่มต้นได้ฟรี

เรียนรู้ Zig ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

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

บทเรียน “สไลซ์: พอยน์เตอร์บวกความยาว” ฟรีหรือไม่

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

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

อ้างอิงช่วงหนึ่งภายในอาร์เรย์ คุณปฏิบัติ Zig Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

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

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

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

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

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

  1. อาร์เรย์ขนาดคงที่
  2. สไลซ์: พอยน์เตอร์บวกความยาว
  3. การตัดสไลซ์ด้วย array[start..end]
  4. การวนผ่านและแก้ไขสไลซ์
← กลับไปที่ Zig Academy