Chuyển đến nội dung chính
Mô-đun 4 · Bài học 1 trong tổng số 516/50 trong khóa học~8 min
Bài học theo mô-đun (1/5)

Mảng có độ dài cố định

Trong Go, một mảng có độ dài cố định, được đưa vào loại của nó: [N]T. Nó là một dạng nguyên thủy hiếm khi được sử dụng trực tiếp trong mã ứng dụng - bạn sẽ hầu như luôn hoạt động với lát (bài học tiếp theo), rất linh hoạt lượt xem trên mảng.

Tuy nhiên, hiểu rõ về mảng là điều cần thiết: mọi thứ trong Go đều được xây dựng trên đầu họ.

Khai báo và khởi tạo

Go
var a [3]int = [3]int{10, 20, 30}
b := [3]int{1, 2, 3}            // inference with :=
c := [3]int{}                   // all zero: [0, 0, 0]
d := [...]int{1, 2, 3, 4}       // length inferred = 4

Giá trị 0 của một mảng là một mảng có độ dài được khai báo với mọi phần tử ở giá trị 0:

Go
var nums [5]int  // [0 0 0 0 0]

Lập chỉ mục và len

Go
a := [3]int{10, 20, 30}
fmt.Println(a[0])      // 10
a[1] = 99
fmt.Println(len(a))    // 3

Truy cập ngoài phạm vi gây ra sự hoảng loạn trong thời gian chạy (không phải là sự im lặng không xác định như ở C).

Chiều dài là một phần của loại

Go
var a [3]int
var b [4]int
// a = b   // ERROR: different types

[3]int và [4]int là các loại riêng biệt, mặc dù cả hai đều có giá trị int. Đây là lý do tại sao mảng hiếm khi được truyền vào hàm: bạn phải mã hóa độ dài thành loại tham số.

Sao chép theo giá trị

Không giống như các lát (tham chiếu) và bản đồ (tham chiếu), các mảng được sao chép bởi giá trị:

Go
a := [3]int{1, 2, 3}
b := a               // copy
b[0] = 99
fmt.Println(a[0])    // 1 — a is unchanged

Điều tương tự cũng được áp dụng khi truyền vào một hàm: hàm đó nhận được bản sao của chính mình.

Khi nào nên sử dụng mảng?

  • Bộ đệm có kích thước cố định được xác định tại thời điểm biên dịch (ví dụ: [16]byte cho MD5).
  • Các khóa bản đồ tổng hợp (các lát cắt không thể "so sánh được", các mảng thì có).
  • Hiệu suất cực cao (không gián tiếp, thân thiện với bộ đệm).

Đối với 99% mã: sử dụng lát.

Hãy thử nó

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

Khai báo a dưới dạng mảng gồm 3 int với các giá trị 10, 20, 30 và in độ dài của nó.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Mảng bằng chữ: `[3]int{a, b, c}`.

Giải pháp khả dụng sau 3 lần thử

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

Khai báo b dưới dạng mảng gồm 5 số nguyên (tất cả đều bằng 0) và gán 99 cho vị trí 2.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

`var b [5]int` bắt đầu bằng [0 0 0 0 0].

Giải pháp khả dụng sau 3 lần thử

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

[3]int và [4]int có cùng loại không?

Go
var a [3]int
var b [4]int
// a = b ?
Tùy chọn trả lời

Tóm tắt lại

  • [N]T: cố định độ dài, một phần của loại.
  • Giá trị 0: mọi phần tử đều có giá trị bằng 0.
  • [...]int{...} để trình biên dịch suy ra độ dài.
  • Sao chép theo giá trị (bao gồm cả các hàm bên trong).
  • Ngoài phạm vi = hoảng loạn, không phải là không xác định.
  • Trong thực tế, hãy sử dụng lát, là các chế độ xem trên mảng.