Cách sao chép một slice vào slice khác trong Golang

Trong Golang, Slice là một chuỗi có độ dài thay đổi, có thể chứa các phần tử cùng loại. Bạn không thể trộn các loại phần tử khác nhau trong một slice. Để sao chép một slice vào một slice khác, Go cung cấp một hàm tích hợp có tên là copy(). Hàm này cho phép bạn sao chép các phần tử từ một slice (slice nguồn) vào một slice khác (slice đích).

Sao chép slice này vào slice khác trong Golang

Ví dụ:

package  main

 import "fmt"

// Slice cơ bản được dùng trong mọi ví dụ
var source = []int{10, 20, 30, 40, 50}

func main() {    
fmt.Println("Source Slice:", source)
}

Cú pháp chuyển một slice vào một slice khác trong Golang

func copy(dst, src []Type) int
  • dst: Slice đích nơi các phần tử sẽ được sao chép.
  • src: Slice nguồn nơi các phần tử sẽ được sao chép.

Hàm trả về số phần tử được sao chép, đây sẽ là số nhỏ nhất trong độ dài của các slice nguồn và đích.

Dùng hàm copy() trong Golang

Sau đây là cách sao chép slice nguồn vào slice đích bằng cách sử dụng hàm copy():

package main
import "fmt"

// Slice cơ bản được dùng trong mọi ví dụ
var source = []int{10, 20, 30, 40, 50}

func main() {
    // Tạo slice đích có độ dài giống như slice nguồn
    destination := make([]int, len(source))
    
    // Sao chép các thành phần từ nguồn tới đích
    count := copy(destination, source)
    
    // In slice
    fmt.Println("Source:", source)
    fmt.Println("Destination:", destination)
    fmt.Println("Elements copied:", count)
}

Kết quả:

Source: [10 20 30 40 50]
Destination: [10 20 30 40 50]
Elements copied: 5

Giải thích chi tiết

  • Tạo Slice: Chúng ta tạo một slice đích có tên là destination bằng cách sử dụng make() có thể chứa cùng số lượng phần tử như slice nguồn.
  • Sao chép các phần tử: Chúng ta sử dụng hàm copy() để sao chép các phần tử từ slice nguồn sang slice đích. Hàm copy() trả về số lượng phần tử đã được sao chép.
  • Hiển thị kết quả: Cuối cùng, chúng ta in cả slice nguồn và slice đích, cùng với số lượng phần tử đã sao chép.

Sao chép thủ công bằng vòng lặp

Bạn có thể tự tay sao chép slice bằng vòng lặp.

Cú pháp:

for i := 0; i < len(source); i++ {    destination[i] = source[i]}

Ví dụ:

package main
import "fmt"

// Slice cơ bản cho mọi ví dụ
var source = []int{10, 20, 30, 40, 50}

func main() {
    destination := make([]int, len(source))

    // Tự tay sao chép từng phần tử
    for i := 0; i < len(source); i++ {
        destination[i] = source[i]
    }

    fmt.Println("Source:", source)
    fmt.Println("Destination:", destination)
}

Kết quả:

Source: [10 20 30 40 50]
Destination: [10 20 30 40 50]

Dùng Slice Literal

Nếu muốn tạo bản sao của một slice trong khi khởi tạo nó, bạn có thể sử dụng một slice literal với hàm append().

Cú pháp

destination = append(destination, source...)

Ví dụ:

package main
import "fmt"

// Slice cơ bản được dùng trong mọi ví dụ
var source = []int{10, 20, 30, 40, 50}

func main() {
    // Sao chép bằng một slice literal
    destination := []int{}
    destination = append(destination, source...)

    fmt.Println("Source:", source)
    fmt.Println("Destination:", destination)
}

Kết quả:

Source: [10 20 30 40 50]
Destination: [10 20 30 40 50]

Lưu ý: Đảm bảo rằng slice đích có độ dài bằng hoặc lớn hơn slice nguồn khi sử dụng copy(); nếu không, hàm sẽ chỉ sao chép tối đa độ dài của slice đích.

Thứ Tư, 21/05/2025 09:36
51 👨 81
Xác thực tài khoản!

Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:

Số điện thoại chưa đúng định dạng!
Số điện thoại này đã được xác thực!
Bạn có thể dùng Sđt này đăng nhập tại đây!
Lỗi gửi SMS, liên hệ Admin
0 Bình luận
Sắp xếp theo
❖
    Chia sẻ
    Chia sẻ FacebookChia sẻ Twitter
    Đóng