Menu
CoddyTech

Sức chứa của slice

Bài học 7 trên 21 trong khóa học Slice và map trong Go của Coddy.

Khi làm việc với lát cắt, một điều có thể gây nhầm lẫn là sự khác nhau giữa độ dài và sức chứa. Trong bài học này, chúng ta sẽ tìm hiểu sức chứa của lát cắt là gì.

Được rồi, bắt đầu nhé. Khai báo này tạo một lát cắt mới như sau:

var names []string

Đây là một lát cắt mới nên nó chưa có mảng nền, vì vậy tất cả các trường của nó đều có giá trị 0.

Khi dùng hàm <strong>len</strong> hoặc hàm <strong>cap</strong> trên lát cắt này, cả hai đều trả về 0. Tuy nhiên, khi dùng một giá trị literal của lát cắt, Go sẽ tạo một mảng nền mới:

names := []string{"Python", "Java", "Rust"}

Giá trị literal cuối cùng này có ba phần tử, vì vậy mảng nền của lát cắt <strong>names</strong> cũng có ba phần tử. Do đó, sức chứa là độ dài của mảng nền của lát cắt, chứ không phải độ dài của chính lát cắt.

Để hiểu rõ hơn, hãy xem một ví dụ khác:

names := []string{"Python", "Golang", "Rust", "JavaScript", "Haskell"}
nameSlice := names[1:]

Vậy hãy thử nghĩ xem: lát cắt <strong>nameSlice</strong> trong ví dụ này có sức chứa là bao nhiêu? 

Đáp án là 4. Ở đây, ta bắt đầu từ chỉ số 1 đến cuối lát cắt, và có thể kiểm tra như sau:

names := []string{"Python", "Golang", "Rust", "JavaScript", "Haskell"}
nameSlice := names[1:]
fmt.Println(nameSlice)
fmt.Println(cap(nameSlice))

Kết quả sẽ là:

[Golang Rust JavaScript Haskell]
4

Vậy hãy nhớ, để đếm sức chứa, ta bắt đầu từ vị trí đầu tiên đến cuối lát cắt.

Ngay cả khi ta làm như sau:

names := []string{"Python", "Golang", "Rust", "JavaScript", "Haskell"}
nameSlice := names[1:4]
fmt.Println(nameSlice)
fmt.Println(cap(nameSlice))

Ở đây, độ dài thay đổi và ta chỉ nhận được <strong>ba phần tử</strong>:

[Golang Rust JavaScript]
4

Nhưng sức chứa vẫn giữ nguyên. Vì vậy, hãy chú ý: độ dài không phải lúc nào cũng bằng sức chứa."

challenge icon

Thử thách

Dễ

Trong đoạn code đã cho, chúng ta định nghĩa một lát cắt gồm 10 phần tử. 

  • Thực hiện thao tác cắt lát để tạo một lát cắt khác và in ra sức chứa của lát cắt đó. Kết quả phải bằng 6.

Tự làm thử

package main

import (
	"fmt"
)

func main() {
    // Slice gồm 10 phần tử
	lang := []string{"Python", "Java", "JavaScript", "C++", "Go", "Ruby", "Swift", "Rust", "PHP", "Kotlin"}
	// Thực hiện thao tác cắt slice ở đây
 
	// Hoàn thiện hàm (function) Print 
	fmt.Println("the capacity of this Slice is :" ?)

}

Tất cả bài học trong Slice và map trong Go

Tự luyện tập: Trình biên dịch Go online