[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-learn-rust-ep9-slices-string-array-all--*":3,"academy-blog-translations-25djpy3g1n41879":78},{"data":4,"page":77,"perPage":77,"totalItems":77,"totalPages":77},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":70,"keywords":71,"locale":46,"published_at":72,"scheduled_at":13,"school_blog":68,"short_description":73,"slug":74,"status":66,"title":75,"updated":76,"updated_by":13,"views":69},"String Slices และ Array Slices ในภาษา Rust","sclblg987654321","school_blog_translations","\u003Cp>ยินดีต้อนรับกลับสู่ \u003Cstrong>Rust The Series\u003C\u002Fstrong> ครับ! จาก EP.8 ที่เราได้รู้จักการยืม (Borrowing) ข้อมูลแบบทั้งก้อนไปแล้ว วันนี้เราจะมาแอดวานซ์ขึ้นอีกนิด กับสถานการณ์ที่เราไม่ได้ต้องการข้อมูลทั้งหมด แต่ต้องการแค่บางส่วน ของมันมาใช้งานครับ ลองจินตนาการว่าเรามีข้อความยาวๆ อย่าง \u003Ccode>\"Superdev Academy\"\u003C\u002Fcode> แต่อยากได้แค่คำว่า \u003Ccode>\"Superdev\"\u003C\u002Fcode> มาประมวลผลต่อล่ะ?\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>ในภาษาทั่วไป:\u003C\u002Fstrong> เราอาจต้องสั่งตัดคำ (Substring) แล้วสร้างตัวแปรใหม่ขึ้นมา ซึ่งหมายถึงการจอง Memory เพิ่มเพื่อเก็บข้อมูลชุดเดิมซ้ำอีกรอบ\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>ในภาษา Rust:\u003C\u002Fstrong> เรามีอาวุธที่เรียกว่า Slice ที่ช่วยให้เราหยิบเฉพาะส่วนที่ต้องการมาใช้ได้ทันที โดยไม่ต้องคัดลอกข้อมูลใหม่แม้แต่ไบต์เดียว!\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>1. Slice คืออะไร?\u003C\u002Fh2>\u003Cp>ถ้าจะอธิบายให้เห็นภาพที่สุด Slice คือการสร้างหน้าต่างเล็กๆ เพื่อส่องดูข้อมูลแค่บางช่วงใน Collection ขนาดใหญ่ (เช่น String หรือ Array) ครับ\u003C\u002Fp>\u003Cp>ในเชิงเทคนิค Slice เป็นข้อมูลประเภท Reference ชนิดหนึ่ง แต่มันมีความพิเศษกว่า Reference ปกติ เพราะมันเป็นข้อมูลแบบ Two-word object หรือที่โปรแกรมเมอร์สาย Rust มักเรียกว่า Fat Pointer ซึ่งเก็บค่าสำคัญไว้แค่ 2 อย่างเท่านั้น:\u003C\u002Fp>\u003Col>\u003Cli>\u003Cp>\u003Cstrong>ตำแหน่งเริ่มต้น (Pointer):\u003C\u002Fstrong> ชี้ไปยังจุดแรกของข้อมูลที่เราสนใจใน Memory\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>ความยาวของข้อมูล (Length):\u003C\u002Fstrong> บอกว่านับจากจุดเริ่มต้นไป เราจะเอาข้อมูลยาวเท่าไหร่\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Fol>\u003Ch3>จุดเด่นที่ทำให้ Slice เหนือกว่าการตัดคำทั่วไป:\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>No Ownership:\u003C\u002Fstrong> Slice เป็นแค่ผู้ยืมเสมอ มันไม่มีสิทธิ์เป็นเจ้าของข้อมูลจริง ดังนั้นเมื่อ Slice หมดอายุ ข้อมูลต้นทางก็ยังอยู่ปกติ\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Zero-Copy:\u003C\u002Fstrong> ไม่มีการคัดลอกข้อมูลใหม่ (No Allocation) มันแค่ชี้กลับไปที่ข้อมูลชุดเดิมที่มีอยู่แล้วบน Heap หรือ Stack ทำให้ประหยัดทรัพยากรแบบสุดๆ\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Lightweight:\u003C\u002Fstrong> ไม่ว่าข้อมูลต้นทางจะใหญ่ระดับกิกะไบต์ แต่ตัว Slice เองก็ยังมีขนาดเล็กนิดเดียว (แค่ Pointer + Length) เท่าเดิมเสมอ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>2. String Slices (&amp;str)\u003C\u002Fh2>\u003Cp>ในภาษา Rust ข้อมูลประเภท String Slice จะเขียนแทนด้วยตัวย่อ \u003Cstrong>\u003Ccode>&amp;str\u003C\u002Fcode>\u003C\u002Fstrong> (อ่านว่า String Slice) ซึ่งวิธีสร้างก็ง่ายมากครับ เราจะใช้เครื่องหมาย \u003Cstrong>\u003Ccode>[start..end]\u003C\u002Fcode>\u003C\u002Fstrong> หรือที่เรียกว่า Range Syntax ในการเลือกช่วงข้อมูลที่ต้องการ\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>start:\u003C\u002Fstrong> คือ Index เริ่มต้น (นับรวมตัวนี้ด้วย)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>end:\u003C\u002Fstrong> คือ Index ตัวสุดท้าย (แต่ไม่รวมตัวนี้! หรือที่เรียกว่า Exclusive)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Rust\u003C\u002Fp>\u003Cpre>\u003Ccode>fn main() {\n    let s = String::from(\"Superdev Academy\");\n\n    \u002F\u002F ยืมตั้งแต่ index 0 ถึง 7 (ตัวที่ 8 ไม่เอา)\n    let superdev = &amp;s[0..8];  \n    \n    \u002F\u002F ยืมตั้งแต่ index 9 ถึง 15 (ตัวที่ 16 ไม่เอา)\n    let academy = &amp;s[9..16]; \n\n    println!(\"First word: {}\", superdev); \u002F\u002F ผลลัพธ์: Superdev\n    println!(\"Second word: {}\", academy); \u002F\u002F ผลลัพธ์: Academy\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>🔥 Rust Trick: การเขียน Range แบบย่อ\u003C\u002Fh3>\u003Cp>Rust ออกแบบมาให้เราเขียนโค้ดได้กระชับขึ้น ถ้าเราต้องการเริ่มจากตัวแรกสุด หรือไปจนถึงตัวสุดท้าย เราไม่จำเป็นต้องใส่ตัวเลขครบก็ได้ครับ:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>\u003Ccode>[..5]\u003C\u002Fcode>\u003C\u002Fstrong> : เริ่มตั้งแต่ตัวแรกสุด (Index 0) ไปจนถึงก่อน Index 5\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>\u003Ccode>[3..]\u003C\u002Fcode>\u003C\u002Fstrong> : เริ่มจาก Index 3 ไปจนจบข้อความ (ไม่ต้องนับ \u003Ccode>len\u003C\u002Fcode> เอง)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>\u003Ccode>[..]\u003C\u002Fcode>\u003C\u002Fstrong> : ยืมข้อมูลทั้งหมดตั้งแต่ตัวแรกถึงตัวสุดท้าย\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>3. Slice กับความปลอดภัย (Safety)\u003C\u002Fh2>\u003Cp>นี่คือจุดที่ Rust โชว์เหนือในเรื่องความปลอดภัยครับ เพราะการยืมข้อมูลบางส่วนอาจดูเหมือนง่าย แต่ถ้าจัดการไม่ดีในภาษาอื่น โปรแกรมอาจจะไปดึงข้อมูลมั่วซั่ว (Out of bounds) หรือข้อมูลที่ถูกลบไปแล้วมาแสดงผลได้ แต่ Rust ป้องกันเรื่องนี้ให้เรา 2 ชั้นครับ:\u003C\u002Fp>\u003Ch3>ชั้นที่ 1: ป้องกันการเข้าถึง Index ที่ไม่มีอยู่จริง (Bound Checking)\u003C\u002Fh3>\u003Cp>ถ้าคุณระบุ Index ของ Slice เกินขอบเขตของข้อมูลจริง (เช่น ตัวแปรมี 10 ตัวแต่จะเอาถึง Index ที่ 20) โปรแกรม Rust จะสั่ง \u003Cstrong>Panic\u003C\u002Fstrong> (หยุดการทำงาน) ทันทีในขั้นตอน Runtime เพื่อป้องกันไม่ให้โปรแกรมไปแอบอ่าน Memory ส่วนอื่นที่ตัวเองไม่มีสิทธิ์เข้าถึง\u003C\u002Fp>\u003Ch3>ชั้นที่ 2: กฎของ Borrowing ยังตามมาคุ้มครองถึงที่!\u003C\u002Fh3>\u003Cp>จำกฎเหล็กใน EP.8 ได้ไหมครับ? \u003Cstrong>\"ถ้ามีคนยืมอ่าน ห้ามคนอื่นมาแก้\"\u003C\u002Fstrong> กฎนี้ก็มีผลกับ Slice เช่นกันครับ ลองดูตัวอย่างนี้:\u003C\u002Fp>\u003Cp>Rust\u003C\u002Fp>\u003Cpre>\u003Ccode>fn main() {\n    let mut s = String::from(\"hello world\");\n\n    \u002F\u002F ยืมอ่านข้อมูลแค่ช่วงแรก \"hello\" ผ่าน Slice\n    let word = &amp;s[0..5]; \n\n    \u002F\u002F ❌ ERROR! คอมไพเลอร์จะด่าทันทีถ้าเราสั่ง s.clear()\n    \u002F\u002F เพราะ s.clear() ต้องใช้สิทธิ์ในการแก้ไข (Mutable) \n    \u002F\u002F แต่ตอนนี้ word ยัง \"ถือสิทธิ์การยืมอ่าน\" ค้างไว้อยู่!\n    \u002F\u002F s.clear(); \n\n    println!(\"The slice is: {}\", word); \n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cstrong>ทำไม Rust ถึงห้าม?\u003C\u002Fstrong> เพราะถ้าเราสั่ง \u003Ccode>s.clear()\u003C\u002Fcode> ข้อมูลใน Memory จะถูกล้างทิ้งทันที แต่ตัวแปร \u003Ccode>word\u003C\u002Fcode> (ซึ่งเป็น Slice) ยังคงชี้ไปที่ตำแหน่งเดิมใน Memory ถ้า Rust ยอมให้รันต่อ \u003Ccode>word\u003C\u002Fcode> ก็จะกลายเป็น Dangling Reference (การชี้ไปที่ความว่างเปล่า) ซึ่งอันตรายมากครับ!\u003C\u002Fp>\u003Ch2>4. Array Slices\u003C\u002Fh2>\u003Cp>ไม่ใช่แค่ String เท่านั้นนะครับที่ทำแบบนี้ได้ Array ทั่วไปก็สามารถทำ Slice ได้เหมือนกัน! ซึ่งมีประโยชน์มหาศาลเวลาที่เรามีข้อมูลชุดใหญ่ แต่ต้องการส่งแค่เซกเมนต์ (Segment) บางส่วนเข้าไปประมวลผลในฟังก์ชัน โดยไม่ต้องเสียเวลา Copy ค่าออกมาเป็น Array ใหม่\u003C\u002Fp>\u003Cp>Rust\u003C\u002Fp>\u003Cpre>\u003Ccode>fn main() {\n    let a = [10, 20, 30, 40, 50];\n\n    \u002F\u002F ยืมข้อมูลจาก index 1 ถึง 2 (ไม่รวม index 3)\n    let slice = &amp;a[1..3]; \n\n    \u002F\u002F ตรวจสอบค่า: slice จะมีค่าเป็น [20, 30]\n    assert_eq!(slice, &amp;[20, 30]);\n\n    println!(\"Slice of array: {:?}\", slice); \n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>💡 เกร็ดความรู้เพิ่มเติม (Pro Insights):\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Universal Concept:\u003C\u002Fstrong> ใน Rust ข้อมูลประเภท Slice ของ Array จะมีหน้าตาเป็น \u003Ccode>&amp;[T]\u003C\u002Fcode> (เมื่อ T คือประเภทข้อมูล เช่น \u003Ccode>i32\u003C\u002Fcode>)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Flexibility:\u003C\u002Fstrong> การใช้ Array Slice ช่วยให้โค้ดของคุณยืดหยุ่นขึ้นมาก เพราะคุณสามารถเขียนฟังก์ชันที่รับข้อมูลขนาดเท่าไหร่ก็ได้ (จะรับ 2 ตัวจาก Array ที่มี 100 ตัว หรือรับทั้ง 100 ตัวเลยก็ได้) โดยใช้รูปแบบการเขียนเดิมเสมอครับ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>5. ทำไมเราควรใช้ &amp;str แทน &amp;String ในพารามิเตอร์?\u003C\u002Fh2>\u003Cp>นี่คือ \u003Cstrong>Best Practice\u003C\u002Fstrong> สำคัญของชาว Rustacean เลยครับ! หากคุณกำลังเขียนฟังก์ชันที่ต้องการแค่อ่านหรือใช้งานข้อความเฉยๆ โดยไม่ได้ต้องการเป็นเจ้าของ (Ownership) ให้คุณรับพารามิเตอร์เป็น \u003Cstrong>\u003Ccode>&amp;str\u003C\u002Fcode> (String Slice)\u003C\u002Fstrong> แทนที่จะเป็น \u003Ccode>&amp;String\u003C\u002Fcode> เสมอครับ\u003C\u002Fp>\u003Ch3>เหตุผลคือความยืดหยุ่นที่เหนือกว่า:\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>ถ้าคุณรับเป็น \u003Ccode>&amp;String\u003C\u002Fcode>:\u003C\u002Fstrong> ฟังก์ชันนั้นจะรับได้แค่ตัวแปรประเภท \u003Ccode>String\u003C\u002Fcode> เท่านั้น\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>ถ้าคุณรับเป็น \u003Ccode>&amp;str\u003C\u002Fcode>:\u003C\u002Fstrong> ฟังก์ชันของคุณจะกลายเป็น \"เครื่องจักรเอนกประสงค์\" เพราะมันจะรับได้ทั้ง:\u003C\u002Fp>\u003Col>\u003Cli>\u003Cp>\u003Cstrong>String ปกติ\u003C\u002Fstrong> (ผ่านเทคนิคที่เรียกว่า \u003Cem>Deref Coercion\u003C\u002Fem> ซึ่ง Rust จะแปลง \u003Ccode>&amp;String\u003C\u002Fcode> เป็น \u003Ccode>&amp;str\u003C\u002Fcode> ให้โดยอัตโนมัติ)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>String Slice\u003C\u002Fstrong> (ข้อมูลบางส่วนที่เราตัดมา)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>String Literal\u003C\u002Fstrong> (ข้อความในอัญประกาศ \u003Ccode>\"...\"\u003C\u002Fcode> ที่เราพิมพ์ลงไปตรงๆ)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Fol>\u003C\u002Fli>\u003C\u002Ful>\u003Cblockquote>\u003Cp>\u003Cstrong>สรุปสั้นๆ:\u003C\u002Fstrong> การใช้ \u003Ccode>&amp;str\u003C\u002Fcode> ช่วยให้ฟังก์ชันของคุณใช้งานได้หลากหลายสถานการณ์มากกว่า โดยที่ประสิทธิภาพยังเร็วแรงเท่าเดิมครับ!\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>\u003C\u002Fp>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch3>สรุป\u003C\u002Fh3>\u003Cp>Slice คือเครื่องมือทรงพลังที่ช่วยให้เราเข้าถึงข้อมูลบางส่วนได้อย่างรวดเร็วและประหยัดทรัพยากรที่สุด เพราะในเชิงเทคนิค มันคือการสร้าง \"หน้าต่าง\" เพื่อชี้ไปยังข้อมูลเดิมที่มีอยู่แล้ว แทนที่จะต้องเสียเวลาสร้างข้อมูลใหม่ให้หนักเครื่องนั่นเองครับ\u003C\u002Fp>\u003Cp>📌 \u003Cstrong>ใน EP. ถัดไป (EP.10):\u003C\u002Fstrong> เราจะพักเรื่อง Memory กันสักนิด แล้วไปลุยเรื่องการจัดระเบียบข้อมูลให้เป็นระบบด้วย Structs ซึ่งเป็นพื้นฐานสำคัญของการเขียนโปรแกรมสไตล์ Object-Oriented ในแบบฉบับของ Rust... บอกเลยว่าห้ามพลาดครับ! แล้วเจอกัน 🦀✨\u003C\u002Fp>\u003Cp>🎯 \u003Cstrong>ติดตามความรู้สาย Dev แบบสุดจัดได้ที่:\u003C\u002Fstrong> ไม่อยากพลาดบทความเทคนิคเชิงลึกและอัปเดตใหม่ๆ จากทีมงาน \u003Cstrong>Superdev Academy\u003C\u002Fstrong> ติดตามเราได้ทุกช่องทางที่นี่ครับ:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>Superdev Academy Thailand\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(อัปเดตข่าวสารและบทความใหม่)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🎬 YouTube: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\">\u003Cstrong>Superdev Academy Channel\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(ติวเข้มแบบวิดีโอ)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\">\u003Cstrong>@superdevacademy\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(เกร็ดความรู้สั้นๆ และเบื้องหลังการทำงาน)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>@superdevacademy\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(Tips &amp; Tricks ฉบับย่อยง่าย)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"http:\u002F\u002Fsuperdevacademy.com\">\u003Cstrong>superdevacademy.com\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(คลังบทความและคอร์สเรียนฉบับเต็ม)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003C\u002Fp>","17benqy0entn_rjipppphgm.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Flpvgmb4ybl53scs\u002F17benqy0entn_rjipppphgm.png","2026-04-27 03:45:09.095Z","",{"keywords":15,"locale":40,"school_blog":50},[16,22,27,31,35],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":19,"updated_by":13},"sclkey987654321","school_keywords","2026-04-27 03:00:35.773Z","zqd02oa08lbb7oz","สอนภาษา Rust",{"collectionId":17,"collectionName":18,"created":23,"created_by":13,"id":24,"name":25,"updated":26,"updated_by":13},"2026-03-04 08:20:06.235Z","254619mvnk1hr7y","Rust","2026-04-10 16:07:25.292Z",{"collectionId":17,"collectionName":18,"created":28,"created_by":13,"id":29,"name":30,"updated":28,"updated_by":13},"2026-04-27 03:38:28.127Z","t24olo2vlk1mnp2","String Slice",{"collectionId":17,"collectionName":18,"created":32,"created_by":13,"id":33,"name":34,"updated":32,"updated_by":13},"2026-04-27 03:38:34.914Z","f12ivjr74oheej2","Array Slice",{"collectionId":17,"collectionName":18,"created":36,"created_by":13,"id":37,"name":38,"updated":39,"updated_by":13},"2026-03-04 08:26:32.963Z","139ocmnehpp39zm","Slices","2026-04-10 16:07:30.811Z",{"code":41,"collectionId":42,"collectionName":43,"created":44,"flag":45,"id":46,"is_default":47,"label":48,"updated":49},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":51,"collectionId":52,"collectionName":53,"expand":54,"id":68,"views":69},"mfqe235iv6x1or8","pbc_2105096300","school_blogs",{"category":55},{"blogIds":56,"collectionId":57,"collectionName":58,"created":59,"created_by":13,"id":51,"image":60,"image_alt":13,"image_path":61,"label":62,"name":63,"priority":64,"publish_at":65,"scheduled_at":13,"status":66,"updated":67,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-16 04:40:07.104Z","47vt5s1gglj_tz0b90vnge.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fmfqe235iv6x1or8\u002F47vt5s1gglj_tz0b90vnge.png",{"en":63,"th":63},"Rust The Series",2,"2026-03-16 04:40:09.199Z","published","2026-04-25 02:32:15.619Z","25djpy3g1n41879",160,"lpvgmb4ybl53scs",[20,24,29,33,37],"2026-04-28 04:40:11.375Z","เรียนรู้วิธีใช้ Slices ในภาษา Rust เพื่อเข้าถึงข้อมูลบางส่วนใน String และ Array ได้อย่างรวดเร็วโดยไม่ต้องคัดลอกข้อมูลใหม่ (Zero-Copy) พร้อมเทคนิคการเขียนฟังก์ชันด้วย &str เพื่อความยืดหยุ่นสูงสุด","learn-rust-ep9-slices-string-array","การใช้งาน Slices เพื่อจัดการข้อมูลบางส่วนแบบ Zero-Copy | Rust The Series EP.9","2026-04-28 04:40:11.376Z",1,{"th":74,"en":74}]