Bài học theo mô-đun (2/5)
Lát: cấu trúc thành ngữ
lát là cấu trúc dữ liệu được sử dụng nhiều nhất trong Go: chế độ xem động
trên một mảng cơ bản. Cú pháp: []T. Không giống như mảng, độ dài là
không phải là một phần của loại và bạn có thể phát triển nó bằng append.
Giải phẫu của một lát
Bên trong một lát cắt là một cấu trúc ba trường:
- một con trỏ tới phần tử đầu tiên trong mảng cơ bản
- a độ dài (
len): số phần tử hiển thị - a dung lượng (
cap): các phần tử có sẵn khi bắt đầu chế độ xem đến cuối mảng cơ bản
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3Sáng tạo
a := []int{1, 2, 3} // literal
b := make([]int, 3) // [0 0 0] len=3 cap=3
c := make([]int, 3, 10) // len=3 cap=10 (reserved)
var d []int // nil slice: len=0 cap=0, still usable with appendappend: luôn gán kết quả
append thêm các phần tử và trả về một phần mới (có thể
phân bổ một mảng mới nếu dung lượng không đủ):
s := []int{1, 2, 3}
s = append(s, 4) // [1 2 3 4]
s = append(s, 5, 6, 7) // append multiple elements
s = append(s, altra...) // concatenate another slice (spread)Biểu thức lát s[a:b]
Trích xuất một lát cắt phụ từ a (đã bao gồm) đến b (độc quyền):
s := []int{10, 20, 30, 40, 50}
sub := s[1:4] // [20 30 40]
inizio := s[:2] // [10 20]
fine := s[3:] // [40 50]
intera := s[:] // [10 20 30 40 50]Các lát cắt phụ chia sẻ mảng cơ bản với lát cắt ban đầu:
các đột biến thông qua sub[i] = ... cũng được hiển thị trong s.
Cạm bẫy: chia sẻ mảng
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s) // [99 2 3 4] — modified!Để có bản sao độc lập, hãy sử dụng copy hoặc append:
out := make([]int, len(sub))
copy(out, sub)Hãy thử nó
Tạo một lát s với [1, 2, 3] và sử dụng phần bổ sung để thêm 4.
Hiển thị gợi ý
LUÔN LUÔN gán kết quả của việc nối lại vào `s`.
Giải pháp khả dụng sau 3 lần thử
Sử dụng biểu thức lát cắt để trích xuất các phần tử từ chỉ mục bao gồm 1 đến chỉ mục loại trừ 3 (tức là [20, 30]).
Hiển thị gợi ý
Cú pháp: `s[start:end]`, `bắt đầu` bao gồm, `kết thúc` độc quyền.
Giải pháp khả dụng sau 3 lần thử
Viết cái nào trong số này SAI?
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)Tóm tắt lại
[]T: chế độ xem động trên một mảng; gấp ba (ptr, len, cap).make([]T, len, cap)để phân bổ trước;var s []Tđể có một phần không thể sử dụng được.s = append(s, ...): LUÔN LUÔN ấn định kết quả.s[a:b]chia sẻ mảng cơ bản:copy(...)cho các bản sao độc lập.- Một lát
nil= OK để đọc/phạm vi/nối thêm; hoàn toàn khác với một bản đồ không.