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
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 = 4Giá 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:
var nums [5]int // [0 0 0 0 0]Lập chỉ mục và len
a := [3]int{10, 20, 30}
fmt.Println(a[0]) // 10
a[1] = 99
fmt.Println(len(a)) // 3Truy 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
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ị:
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]bytecho 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ó
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ó.
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ử
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.
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ử
[3]int và [4]int có cùng loại không?
var a [3]int
var b [4]int
// a = b ?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.