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).
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ách sao chép slice trong Golang
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.