Đi - Lát
Go Slice là một sự trừu tượng so với Go Array. Go Array cho phép bạn xác định các biến có thể chứa một số mục dữ liệu cùng loại nhưng nó không cung cấp bất kỳ phương thức sẵn có nào để tăng kích thước của nó một cách động hoặc lấy một mảng con của riêng nó. Slices khắc phục hạn chế này. Nó cung cấp nhiều chức năng tiện ích cần thiết trên Array và được sử dụng rộng rãi trong lập trình Go.
Xác định một lát cắt
Để xác định một lát cắt, bạn có thể khai báo nó dưới dạng một mảng mà không cần chỉ định kích thước của nó. Ngoài ra, bạn có thể sử dụngmake chức năng tạo một lát cắt.
var numbers []int /* a slice of unspecified size */
/* numbers == []int{0,0,0,0,0}*/
numbers = make([]int,5,5) /* a slice of length 5 and capacity 5*/
hàm len () và cap ()
Một lát cắt là một sự trừu tượng hóa trên mảng. Nó thực sự sử dụng mảng như một cấu trúc cơ bản. Cáclen() hàm trả về các phần tử có trong phần cap()hàm trả về dung lượng của lát cắt (tức là nó có thể chứa bao nhiêu phần tử). Ví dụ sau giải thích cách sử dụng của lát cắt -
package main
import "fmt"
func main() {
var numbers = make([]int,3,5)
printSlice(numbers)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
len = 3 cap = 5 slice = [0 0 0]
Nil lát
Nếu một lát cắt được khai báo không có đầu vào, thì theo mặc định, nó được khởi tạo là nil. Chiều dài và công suất của nó bằng không. Ví dụ -
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
if(numbers == nil){
fmt.Printf("slice is nil")
}
}
func printSlice(x []int){
fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x)
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
len = 0 cap = 0 slice = []
slice is nil
Đăng ký
Slice cho phép giới hạn dưới và giới hạn trên được chỉ định để lấy sublice của nó bằng cách sử dụng[lower-bound:upper-bound]. Ví dụ -
package main
import "fmt"
func main() {
/* create a slice */
numbers := []int{0,1,2,3,4,5,6,7,8}
printSlice(numbers)
/* print the original slice */
fmt.Println("numbers ==", numbers)
/* print the sub slice starting from index 1(included) to index 4(excluded)*/
fmt.Println("numbers[1:4] ==", numbers[1:4])
/* missing lower bound implies 0*/
fmt.Println("numbers[:3] ==", numbers[:3])
/* missing upper bound implies len(s)*/
fmt.Println("numbers[4:] ==", numbers[4:])
numbers1 := make([]int,0,5)
printSlice(numbers1)
/* print the sub slice starting from index 0(included) to index 2(excluded) */
number2 := numbers[:2]
printSlice(number2)
/* print the sub slice starting from index 2(included) to index 5(excluded) */
number3 := numbers[2:5]
printSlice(number3)
}
func printSlice(x []int){
fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x)
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
len = 9 cap = 9 slice = [0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
len = 0 cap = 5 slice = []
len = 2 cap = 9 slice = [0 1]
len = 3 cap = 7 slice = [2 3 4]
append () và copy () các hàm
Người ta có thể tăng dung lượng của một lát bằng cách sử dụng append()chức năng. Sử dụngcopy(), nội dung của lát nguồn được sao chép sang lát đích. Ví dụ -
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
/* append allows nil slice */
numbers = append(numbers, 0)
printSlice(numbers)
/* add one element to slice*/
numbers = append(numbers, 1)
printSlice(numbers)
/* add more than one element at a time*/
numbers = append(numbers, 2,3,4)
printSlice(numbers)
/* create a slice numbers1 with double the capacity of earlier slice*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* copy content of numbers to numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
len = 0 cap = 0 slice = []
len = 1 cap = 2 slice = [0]
len = 2 cap = 2 slice = [0 1]
len = 5 cap = 8 slice = [0 1 2 3 4]
len = 5 cap = 16 slice = [0 1 2 3 4]