ข้อมูลแบบ slice

จากคราวก่อนที่บอกว่า array นั้นเป็นข้อมูลที่กำหนดขนาดชัดเจน array ที่มีขนาดต่างกัน ถือว่าเป็นข้อมูลคนละประเภทกันเลย เช่น

var a [5]int

var b [10]int

ถือว่า a และ b เป็นข้อมูลคนละแบบ a เป็น array ของ int ขนาด 5 ตัว และ b เป็น array ของ int ขนาด 10 ตัว

ทีนี้ ถ้าเราต้องการจัดการ array ที่มีขนาดต่างๆกัน เราจะทำอย่างไร สำหรับ Go ได้สร้างข้อมูลอีกประเภทขึ้นมาเลยคือ slice นั่นเอง

 

การประกาศตัวแปรของ slice

การประกาศตัวแปรของ slice ทำได้เกือบเหมือน array ต่างกันตรงไม่ต้องกำหนดขนาดนั่นเอง เช่น

var a []int

var b []int

slice เป็นประเภทข้อมูลที่เอามาจัดการ array อีกที นั่นคือโครงสร้างภายในของ slice เป็น array นั่นเอง เราสามารถสร้าง array ให้กับ slice ได้สองแบบ แบบแรกคือใช้ keyword make อีกแบบคือใช้ operator [start : end] โดย start และ end เป็นตัวเลข index เริ่มต้น และ สิ้นสุด เพื่อช่วยตัดข้อมูลภายใน array ซึ่งเรามากเรียกเป็นคำกิริยากันว่า ทำการ slice ขอมูลของ array นั่นเอง นั่นละคือที่มาของคำว่าประเภทข้อมูลแบบ slice

ตัวอย่างการใช้ operator slice [:] เช่น

var list [5]int = [5]int {1, 2, 3, 4, 5}

var s []int = list[1:3]

ข้อมูลที่ slice s มีคือ 2,3 นั่นเอง

นอกจากจะกำหนดเริ่มต้นและสิ้นสุด การ slice ยังสามารถกำหนดแค่จุดเริ่มต้น หรือสิ้นสุดได้เหมือนกัน เช่น

var s []int = list[3:]

ข้อมูลที่ slice s มีคือ 4,5

var s []int = list[:3]

ข้อมูลที่ slice s มีคือ 1,2,3

 

ค่าคงที่ slice

นอกจากจะสร้างข้อมูลแบบ slice ด้วยการใช้ slice operator [:] แล้ว เรายังกำหนดค่าเริ่มต้นด้วยค่าคงที่ของ slice ได้เช่นกันซึ่งทำได้เหมือน array แค่ไม่กำหนดขนาด เช่น

var a []int = []int {10, 20, 30}

 

สร้าง slice โดยใช้ keyword make

สุดท้ายเราสามารถสร้าง slice ได้จาก keyword make ซึ่งจะทำการจองหน่วยความจำและกำหนด array ภายในของ slice ให้ ตัวอย่างเช่น

var s []int = make([]int, 5)

จะทำการสร้าง slice ขนาด 5 ซึ่งค่าทั้ง 5 ของ slice จะเป็นค่า zero value (ค่า default) ของ type นั้น เช่น int คือ 0

อีกแบบคือ

var s []int = make([]int,5,10)

เป็นการกำหนดทั้งขนาดของ slice และ ขนาดของ array ภายใน โดยขนาดเป็น 5 และ ขนาดของ array ภายในเป็น 10 เรื่องนี้เดี๋ยวลงรายละเอียดกันอีกทีในเรื่อง ขนาดของ slice และ array คงแยกออกเป็นอีกโพสต์ไปเลย

 

การอ้างอิงตำแหน่ง และ การวนลูปของ slice

ง่ายๆเลยคือ เหมือนกับ array