Sao chép slice
Bài học 13 trên 21 trong khóa học Slice và map trong Go của Coddy.
Trong Go, có một số hàm dựng sẵn mà ta có thể dùng với slice. Ở bài học trước, ta đã dùng một trong số đó là hàm <strong>append</strong>. Hàm này cho phép thêm phần tử vào một slice hiện có. Ta gọi những hàm này là hàm hỗ trợ. Bạn có thể bổ sung điều này vào điểm khác nhau giữa mảng và slice trong Go: mảng không có những hàm này.
Trong bài học này, ta sẽ tìm hiểu hàm <strong>copy</strong>, hàm này cho phép sao chép một slice và hoạt động như sau:
str := []string{"Python", "Golang", "Java", "TypeScript"}
newStr := make([]string, 4)
copy(newStr, str)
fmt.Println(newStr)Kết quả đầu ra sẽ là:
[Python Golang Java TypeScript]Dùng hàm <strong>copy</strong>, ta sao chép các phần tử từ slice <strong>str</strong> sang slice <strong>newStr</strong>. Cú pháp như sau: <strong>copy(destination, source)</strong>.
Vậy nếu dung lượng của slice mới nhỏ hơn slice nguồn thì sao? Hãy xem ví dụ:
str := []string{"Python", "Golang", "Java", "TypeScript"}
newStr := make([]string, 3)
copy(newStr, str)
fmt.Println(newStr)Nếu chạy đoạn code này, ta sẽ nhận được:
[Python Golang Java]Vì dung lượng của slice mới là 3 nên chỉ có chỗ cho 3 phần tử.
Hãy xem ví dụ cho trường hợp ngược lại:
str := []int{23, 34, 56, 77}
newStr := make([]int, 6)
copy(newStr, str)
fmt.Println(newStr)Ở đây, dung lượng của slice mới lớn hơn slice nguồn, nên các phần tử sẽ được sao chép vào kết quả, còn những vị trí còn lại sẽ có giá trị mặc định, với kiểu int thì giá trị đó là 0:
[23 34 56 77 0 0]Thử thách
DễViết một chương trình nhận hai lát cắt rồi gộp chúng thành một lát cắt mới, sau đó in ra màn hình.
Trong code đã cho, chúng ta định nghĩa hai lát cắt số nguyên.
Ở đây, bạn cần dùng toán tử lát cắt cùng với hàm sao chép.
Xem các gợi ý nếu bạn cần thêm trợ giúp.
Tự làm thử
package main
import (
"fmt"
)
func main() {
// Hai lát cắt, đừng thay đổi chúng!
str := []int{1, 2, 3, 4}
str2 := []int{5, 6, 7, 8}
// Tạo lát cắt mới
// Sao chép phần tử
// Sao chép bằng toán tử lát cắt
// In ra lát cắt mới
fmt.Println()
}Tất cả bài học trong Slice và map trong Go
1Giới thiệu
Giới thiệu3Slice phía sau hậu trường
Slice là một mảngTạo slice bằng makeSao chép sliceXóa một phần tửThử thách ôn tập #1Thử thách ôn tập #2Tự luyện tập: Trình biên dịch Go online