len และ cap ของ slice

ข้อมูลแบบ array และ slice นั้นสามารถหาจำนวนที่เก็บอยู่ได้โดยใช้ function ที่ชื่อ len ซึ่งเป็น builtin function ของ Go ตัวอย่างเช่น

l := [3]int {1, 2, 3}

println( len(l) )  /* ได้ค่า 3 */

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

l := make([]int, 3, 5)

ค่าที่สามของ make เป็นจำนวนของหน่วยความจำนั่นเอง ซึ่งจะเรียกว่า capacity เราสามารถหาขนาดของ capacity ของ slice โดยใช้ builtin function ที่ชื่อ cap ตัวอย่างเช่น

l := make([]int, 3, 5)

println( cap(l) ) /* ได้ค่า 5 */

println( len(l) ) /* ได้ค่า 3 */

 

อีกตัวอย่างเช่น

l := [5]int {1, 2, 3, 4, 5}

s := l[:3]

println( cap(l) ) /* ได้ค่า 5 */

println( len(l) ) /* ได้ค่า 3 */

เพราะว่า s เกิดจากการ slice ค่าจาก array l ออกมาโดยเอาแค่ 3 ค่าแรก เลยทำให้ len เป็น 3 แต่ cap ยังคงใช้หน่วยความจำเดิมกับ l เก็บเลยเป็น 5 นั่นเอง