Chuyển đến nội dung chính
Mô-đun 4 · Bài học 2 trong tổng số 517/50 trong khóa học~15 min
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
Go
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3

Sáng tạo

Go
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 append

append: 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 đủ):

Go
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):

Go
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

Go
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:

Go
out := make([]int, len(sub))
copy(out, sub)

Hãy thử nó

tập thể dục#go.m4.l2.e1
Nỗ lực: 0Đang tải…

Tạo một lát s với [1, 2, 3] và sử dụng phần bổ sung để thêm 4.

Đang tải trình chỉnh sửa…
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ử

tập thể dục#go.m4.l2.e2
Nỗ lực: 0Đang tải…

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]).

Đang tải trình chỉnh sửa…
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ử

Quiz#go.m4.l2.e3
Sẵn sàng

Viết cái nào trong số này SAI?

Go
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)
Tùy chọn trả lời

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.