Truy cập, thay đổi, nối và sao chép các lát
Truy cập các phần tử của một Slice
Bạn có thể truy cập một phần tử lát cụ thể bằng cách tham khảo số chỉ mục.
Trong Go, các chỉ mục bắt đầu từ 0. Điều đó có nghĩa là [0] là phần tử đầu tiên, [1] là phần tử thứ hai, v.v.
Ví dụ
Ví dụ này cho thấy cách truy cập phần tử thứ nhất và thứ ba trong phần giá:
package main
import ("fmt")
func main() {
prices := []int{10,20,30}
fmt.Println(prices[0])
fmt.Println(prices[2])
}
Kết quả:
10
30
Thay đổi các phần tử của một lát cắt
Bạn cũng có thể thay đổi một phần tử lát cắt cụ thể bằng cách tham khảo số chỉ mục.
Ví dụ
Ví dụ này cho thấy cách thay đổi phần tử thứ ba trong phần giá:
package main
import ("fmt")
func main() {
prices := []int{10,20,30}
prices[2] = 50
fmt.Println(prices[0])
fmt.Println(prices[2])
}
Kết quả:
10
50
Nối các phần tử vào một lát cắt
Bạn có thể nối các phần tử vào cuối slice bằng append()
:
Cú pháp
slice_name = append( slice_name , element1 , element2 , ...)
Ví dụ
Ví dụ này cho thấy cách nối các phần tử vào cuối slice:
package main
import ("fmt")
func main() {
myslice1 := []int{1, 2, 3, 4, 5, 6}
fmt.Printf("myslice1 =
%v\n", myslice1)
fmt.Printf("length = %d\n", len(myslice1))
fmt.Printf("capacity = %d\n", cap(myslice1))
myslice1 =
append(myslice1, 20, 21)
fmt.Printf("myslice1 = %v\n", myslice1)
fmt.Printf("length = %d\n", len(myslice1))
fmt.Printf("capacity =
%d\n", cap(myslice1))
}
Kết quả:
myslice1 = [1 2 3 4 5 6]
length = 6
capacity = 6
myslice1 = [1 2 3
4 5 6 20 21]
length = 8
capacity = 12
Nối một lát vào một lát khác
Để nối tất cả các phần tử của một lát này vào một lát khác, hãy sử dụng append()
:
Cú pháp
slice3 = append( slice1 , slice2 ...)
Lưu ý: '...' sau slice2 là cần thiết khi nối các phần tử của lát này với lát khác.
Ví dụ
Ví dụ này cho thấy cách nối một lát vào một lát khác:
package main
import ("fmt")
func main() {
myslice1 := []int{1,2,3}
myslice2 := []int{4,5,6}
myslice3 := append(myslice1, myslice2...)
fmt.Printf("myslice3=%v\n",
myslice3)
fmt.Printf("length=%d\n", len(myslice3))
fmt.Printf("capacity=%d\n", cap(myslice3))
}
Kết quả:
myslice3=[1 2 3 4 5 6]
length=6
capacity=6
Thay đổi độ dài của một lát
Không giống như mảng, có thể thay đổi độ dài của một lát cắt.
Ví dụ
Ví dụ này cho thấy cách thay đổi độ dài của một lát cắt:
package main
import ("fmt")
func main() {
arr1 := [6]int{9, 10, 11, 12, 13, 14} // An array
myslice1
:= arr1[1:5] // Slice array
fmt.Printf("myslice1 = %v\n",
myslice1)
fmt.Printf("length = %d\n", len(myslice1))
fmt.Printf("capacity = %d\n", cap(myslice1))
myslice1 =
arr1[1:3] // Change length by re-slicing the array
fmt.Printf("myslice1
= %v\n", myslice1)
fmt.Printf("length = %d\n", len(myslice1))
fmt.Printf("capacity = %d\n", cap(myslice1))
myslice1 =
append(myslice1, 20, 21, 22, 23) // Change length by appending items
fmt.Printf("myslice1 = %v\n", myslice1)
fmt.Printf("length =
%d\n", len(myslice1))
fmt.Printf("capacity = %d\n", cap(myslice1))
}
Kết quả:
myslice1 = [10 11 12 13]
length = 4
capacity = 5
myslice1 = [10 11]
length = 2
capacity = 5
myslice1 = [10 11 20 21 22 23]
length = 6
capacity = 10
Hiệu quả bộ nhớ
Khi sử dụng các slice, Go sẽ tải tất cả các phần tử cơ bản vào bộ nhớ.
Nếu mảng lớn và bạn chỉ cần một vài phần tử, tốt hơn là sao chép các phần tử đó bằng hàm copy()
.
Hàm copy()
tạo một mảng cơ bản mới chỉ có các phần tử cần thiết cho lát cắt. Điều này sẽ làm giảm bộ nhớ sử dụng cho chương trình.
Cú pháp
copy( dest , src )
Hàm copy()
có hai lát dest và src và sao chép dữ liệu từ src sang dest . Nó trả về số phần tử được sao chép.
Ví dụ
Ví dụ này cho thấy cách sử dụng hàm copy()
:
package main
import ("fmt")
func main() {
numbers := []int{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
// Original slice
fmt.Printf("numbers = %v\n", numbers)
fmt.Printf("length = %d\n", len(numbers))
fmt.Printf("capacity =
%d\n", cap(numbers))
// Create copy with only needed numbers
neededNumbers := numbers[:len(numbers)-10]
numbersCopy := make([]int,
len(neededNumbers))
copy(numbersCopy, neededNumbers)
fmt.Printf("numbersCopy = %v\n", numbersCopy)
fmt.Printf("length =
%d\n", len(numbersCopy))
fmt.Printf("capacity = %d\n", cap(numbersCopy))
}
Kết quả:
// Original slice
numbers = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
length = 15
capacity =
15
// New slice
numbersCopy = [1 2 3 4 5]
length = 5
capacity = 5
Dung lượng của lát cắt mới bây giờ nhỏ hơn dung lượng của lát cắt ban đầu vì mảng cơ bản mới nhỏ hơn.