Khóa học go

Slices trong Go Lang

0 phút đọc

Trong Go, slices là một cấu trúc dữ liệu mạnh mẽ và linh hoạt, được sử dụng để quản lý các tập hợp dữ liệu có cùng kiểu. Slices cung cấp một giao diện mạnh mẽ hơn so với mảng (array) và thường được sử dụng thay cho mảng do tính năng động của chúng. Bài viết này sẽ cung cấp một cái nhìn tổng quan chi tiết về slices trong Go, bao gồm cú pháp, cách sử dụng, và các ví dụ minh họa cụ thể.

Khái Niệm Slices

Slices là một đoạn của mảng, cho phép bạn làm việc với một phần của mảng như thể nó là một mảng độc lập. Slices có thể thay đổi kích thước, cho phép thêm hoặc xóa các phần tử một cách linh hoạt. Một slice bao gồm ba thành phần chính:

  • Pointer: Trỏ đến phần tử đầu tiên của mảng mà slice tham chiếu.
  • Length: Số lượng phần tử trong slice.
  • Capacity: Số lượng phần tử tối đa mà slice có thể chứa, bắt đầu từ phần tử đầu tiên của slice đến phần tử cuối cùng của mảng.

Cú Pháp Khai Báo Slices

Có nhiều cách để khai báo và khởi tạo slices trong Go.

Khai Báo Slices Rỗng

Bạn có thể khai báo một slice rỗng bằng cách sử dụng cặp dấu ngoặc vuông [] theo sau là kiểu dữ liệu của các phần tử trong slice.

Ví Dụ:

package main

import "fmt"

func main() {
    var intSlice []int
    var strSlice []string

    fmt.Println(intSlice) // Output: []
    fmt.Println(strSlice) // Output: []
}

Khai Báo Slices với Giá Trị Ban Đầu

Bạn có thể khai báo và khởi tạo một slice với các giá trị ban đầu bằng cách sử dụng cú pháp slice literal.

Ví Dụ:

package main

import "fmt"

func main() {
    intSlice := []int{1, 2, 3, 4, 5}
    strSlice := []string{"Go", "Python", "Java"}

    fmt.Println(intSlice) // Output: [1 2 3 4 5]
    fmt.Println(strSlice) // Output: [Go Python Java]
}

Sử Dụng Hàm make

Hàm make được sử dụng để tạo một slice với độ dài và dung lượng xác định.

Ví Dụ:

package main

import "fmt"

func main() {
    intSlice := make([]int, 5) // Slice với độ dài và dung lượng là 5
    strSlice := make([]string, 3, 5) // Slice với độ dài là 3 và dung lượng là 5

    fmt.Printf("intSlice \tLen: %v \tCap: %v\n", len(intSlice), cap(intSlice))
    fmt.Printf("strSlice \tLen: %v \tCap: %v\n", len(strSlice), cap(strSlice))
}

Truy Cập và Thay Đổi Phần Tử trong Slices

Bạn có thể truy cập và thay đổi các phần tử trong slice bằng cách sử dụng chỉ số của chúng.

Ví Dụ:

package main

import "fmt"

func main() {
    intSlice := []int{1, 2, 3, 4, 5}

    fmt.Println(intSlice[0]) // Output: 1
    fmt.Println(intSlice[4]) // Output: 5

    intSlice[2] = 10
    fmt.Println(intSlice) // Output: [1 2 10 4 5]
}

Thêm và Xóa Phần Tử trong Slices

Go cung cấp các hàm tích hợp sẵn như appendcopy để thêm và xóa các phần tử trong slices.

Thêm Phần Tử với append

Hàm append được sử dụng để thêm các phần tử vào cuối slice. Nếu dung lượng của slice không đủ, một mảng mới sẽ được cấp phát và các phần tử của slice cũ sẽ được sao chép vào mảng mới.

Ví Dụ:

package main

import "fmt"

func main() {
    intSlice := []int{1, 2, 3}
    intSlice = append(intSlice, 4, 5)

    fmt.Println(intSlice) // Output: [1 2 3 4 5]
}

Xóa Phần Tử

Bạn có thể xóa một phần tử khỏi slice bằng cách sử dụng hàm append để nối các phần tử trước và sau phần tử cần xóa.

Ví Dụ:

package main

import "fmt"

func removeIndex(s []string, index int) []string {
    return append(s[:index], s[index+1:]...)
}

func main() {
    strSlice := []string{"India", "Canada", "Japan", "Germany", "Italy"}
    fmt.Println(strSlice) // Output: [India Canada Japan Germany Italy]

    strSlice = removeIndex(strSlice, 3)
    fmt.Println(strSlice) // Output: [India Canada Japan Italy]
}

Tạo Slices từ Mảng

Bạn có thể tạo một slice từ một mảng bằng cách chỉ định phạm vi của các phần tử trong mảng.

Ví Dụ:

package main

import "fmt"

func main() {
    array := [5]int{1, 2, 3, 4, 5}
    slice := array[1:4]

    fmt.Println("Array: ", array) // Output: Array: [1 2 3 4 5]
    fmt.Println("Slice: ", slice) // Output: Slice: [2 3 4]
}

Duyệt Qua Các Phần Tử trong Slices

Bạn có thể sử dụng vòng lặp for hoặc for range để duyệt qua các phần tử trong slice.

Ví Dụ:

package main

import "fmt"

func main() {
    intSlice := []int{1, 2, 3, 4, 5}

    // Sử dụng vòng lặp for
    for i := 0; i < len(intSlice); i++ {
        fmt.Println(intSlice[i])
    }

    // Sử dụng vòng lặp for range
    for index, value := range intSlice {
        fmt.Printf("intSlice[%d] = %d\n", index, value)
    }
}

Slices Đa Chiều

Slices có thể được sử dụng để tạo các cấu trúc dữ liệu đa chiều. Khác với mảng đa chiều, các slices bên trong có thể có độ dài khác nhau.

Ví Dụ:

package main

import "fmt"

func main() {
    // Tạo một slice hai chiều
    twoD := [][]int{
        {1, 2, 3},
        {4, 5},
        {6, 7, 8, 9},
    }

    // Duyệt qua các phần tử của slice hai chiều
    for i := range twoD {
        for j := range twoD[i] {
            fmt.Printf("twoD[%d][%d] = %d\n", i, j, twoD[i][j])
        }
    }
}

Các Hàm Tích Hợp Sẵn cho Slices

Go cung cấp nhiều hàm tích hợp sẵn để làm việc với slices, bao gồm append, copy, len, và cap.

Hàm append

Hàm append được sử dụng để thêm các phần tử vào cuối slice.

Ví Dụ:

package main

import "fmt"

func main() {
    intSlice := []int{1, 2, 3}
    intSlice = append(intSlice, 4, 5)

    fmt.Println(intSlice) // Output: [1 2 3 4 5]
}

Hàm copy

Hàm copy được sử dụng để sao chép các phần tử từ slice nguồn sang slice đích.

Ví Dụ:

package main

import "fmt"

func main() {
    src := []int{1, 2, 3}
    dest := make([]int, 5)

    copy(dest, src)
    fmt.Println(dest) // Output: [1 2 3 0 0]
}

Hàm lencap

Hàm len trả về độ dài của slice, trong khi hàm cap trả về dung lượng của slice.

Ví Dụ:

package main

import "fmt"

func main() {
    intSlice := make([]int, 3, 5)

    fmt.Printf("Length: %d\n", len(intSlice)) // Output: Length: 3
    fmt.Printf("Capacity: %d\n", cap(intSlice)) // Output: Capacity: 5
}

Kết Luận

Slices là một cấu trúc dữ liệu mạnh mẽ và linh hoạt trong Go, cho phép bạn quản lý các tập hợp dữ liệu có cùng kiểu một cách hiệu quả. Bài viết này đã cung cấp một cái nhìn tổng quan chi tiết về slices trong Go, bao gồm cú pháp, cách sử dụng, và các ví dụ minh họa cụ thể. Hiểu rõ về slices sẽ giúp bạn viết mã Go hiệu quả và dễ bảo trì hơn.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Dữ liệu được lưu trữ trong container sẽ bị mất trong những trường hợp nào?

entry

Tầm quan trọng của việc tạo mẫu trong thiết kế là gì?

entry

Các thành phần chính trong Microservices?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào

Khoá học javascript từ cơ bản đến chuyên sâuYoutube Techmely