Trong Go, mảng (array) là một cấu trúc dữ liệu quan trọng cho phép lưu trữ một tập hợp các phần tử có cùng kiểu dữ liệu. Mảng có kích thước cố định và không thể thay đổi sau khi được khai báo. Mặc dù mảng không phổ biến như slice trong Go, nhưng chúng vẫn có vai trò quan trọng trong việc quản lý dữ liệu. Bài viết này sẽ cung cấp một cái nhìn tổng quan chi tiết về mảng trong Go, bao gồm cú pháp, cách sử dụng, và các ví dụ minh họa cụ thể.
Khái Niệm Mảng
Mảng là một tập hợp các phần tử có cùng kiểu dữ liệu, được lưu trữ liên tiếp trong bộ nhớ. Mỗi phần tử trong mảng có một chỉ số (index) bắt đầu từ 0. Mảng có kích thước cố định, nghĩa là số lượng phần tử trong mảng không thể thay đổi sau khi mảng được khai báo.
Cú Pháp Khai Báo Mảng
Có hai cách chính để khai báo mảng trong Go: sử dụng từ khóa var
và sử dụng cú pháp khai báo ngắn gọn.
Sử Dụng Từ Khóa var
Cú pháp khai báo mảng sử dụng từ khóa var
như sau:
go
var array_name [length]Type
Trong đó:
array_name
là tên của mảng.length
là số lượng phần tử trong mảng.Type
là kiểu dữ liệu của các phần tử trong mảng.
Ví Dụ:
go
package main
import "fmt"
func main() {
var arr [5]int
fmt.Println(arr) // Output: [0 0 0 0 0]
}
Sử Dụng Cú Pháp Khai Báo Ngắn Gọn
Cú pháp khai báo mảng sử dụng cú pháp khai báo ngắn gọn như sau:
go
array_name := [length]Type{value1, value2, ..., valueN}
Ví Dụ:
go
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5}
fmt.Println(arr) // Output: [1 2 3 4 5]
}
Truy Cập và Thay Đổi Phần Tử trong Mảng
Bạn có thể truy cập và thay đổi các phần tử trong mảng bằng cách sử dụng chỉ số của chúng. Chỉ số của phần tử đầu tiên là 0 và chỉ số của phần tử cuối cùng là length-1
.
Ví Dụ:
go
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5}
fmt.Println(arr[0]) // Output: 1
fmt.Println(arr[4]) // Output: 5
arr[2] = 10
fmt.Println(arr) // Output: [1 2 10 4 5]
}
Khởi Tạo Mảng
Bạn có thể khởi tạo mảng với các giá trị mặc định hoặc không khởi tạo giá trị cho mảng. Nếu không khởi tạo giá trị, các phần tử trong mảng sẽ được gán giá trị mặc định của kiểu dữ liệu tương ứng.
Ví Dụ:
go
package main
import "fmt"
func main() {
var arr1 [5]int
arr2 := [5]int{1, 2, 3, 4, 5}
arr3 := [...]int{6, 7, 8, 9, 10}
fmt.Println(arr1) // Output: [0 0 0 0 0]
fmt.Println(arr2) // Output: [1 2 3 4 5]
fmt.Println(arr3) // Output: [6 7 8 9 10]
}
Mảng Một Chiều và Mảng Đa Chiều
Mảng trong Go có thể là mảng một chiều hoặc mảng đa chiều. Mảng đa chiều là mảng của các mảng.
Mảng Một Chiều
Mảng một chiều là mảng cơ bản với một dãy các phần tử.
Ví Dụ:
go
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5}
fmt.Println(arr) // Output: [1 2 3 4 5]
}
Mảng Đa Chiều
Mảng đa chiều là mảng của các mảng. Bạn có thể tạo mảng hai chiều, ba chiều, hoặc nhiều chiều hơn.
Ví Dụ:
go
package main
import "fmt"
func main() {
var arr [2][3]int
arr[0][0] = 1
arr[0][1] = 2
arr[0][2] = 3
arr[1][0] = 4
arr[1][1] = 5
arr[1][2] = 6
fmt.Println(arr) // Output: [[1 2 3] [4 5 6]]
}
Duyệt Qua Các Phần Tử trong Mảng
Bạn có thể sử dụng vòng lặp for
để duyệt qua các phần tử trong mảng.
Ví Dụ:
go
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5}
for i := 0; i < len(arr); i++ {
fmt.Println(arr[i])
}
}
Bạn cũng có thể sử dụng vòng lặp for range
để duyệt qua các phần tử trong mảng.
Ví Dụ:
go
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5}
for index, value := range arr {
fmt.Printf("arr[%d] = %d\n", index, value)
}
}
Mảng Là Kiểu Giá Trị
Mảng trong Go là kiểu giá trị, nghĩa là khi bạn gán một mảng cho một biến khác hoặc truyền mảng vào hàm, một bản sao của mảng sẽ được tạo ra. Điều này có nghĩa là thay đổi trên bản sao sẽ không ảnh hưởng đến mảng gốc.
Ví Dụ:
go
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
b := a
b[0] = 10
fmt.Println("a:", a) // Output: a: [1 2 3]
fmt.Println("b:", b) // Output: b: [10 2 3]
}
Truyền Mảng vào Hàm
Khi truyền mảng vào hàm, bạn có thể truyền mảng bằng giá trị hoặc bằng con trỏ.
Truyền Mảng Bằng Giá Trị
Ví Dụ:
go
package main
import "fmt"
func modifyArray(arr [3]int) {
arr[0] = 10
}
func main() {
a := [3]int{1, 2, 3}
modifyArray(a)
fmt.Println(a) // Output: [1 2 3]
}
Truyền Mảng Bằng Con Trỏ
Ví Dụ:
go
package main
import "fmt"
func modifyArray(arr *[3]int) {
arr[0] = 10
}
func main() {
a := [3]int{1, 2, 3}
modifyArray(&a)
fmt.Println(a) // Output: [10 2 3]
}
Mảng và Slice
Mặc dù mảng có vai trò quan trọng trong Go, nhưng slice thường được sử dụng nhiều hơn do tính linh hoạt của chúng. Slice là một lớp trừu tượng trên mảng, cho phép thay đổi kích thước động và cung cấp nhiều hàm tiện ích.
Ví Dụ:
go
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:4]
fmt.Println(slice) // Output: [2 3 4]
}
Kết Luận
Mảng là một cấu trúc dữ liệu quan trọng trong Go, cho phép lưu trữ một tập hợp các phần tử có cùng kiểu dữ liệu. Mặc dù mảng có kích thước cố định và không thể thay đổi sau khi được khai báo, chúng vẫn có vai trò quan trọng trong việc quản lý dữ liệu. Bài viết này đã cung cấp một cái nhìn tổng quan chi tiết về mảng trong Go, bao gồm cú pháp, cách sử dụng, và các ví dụ minh họa cụ thể. Hiểu rõ về mảng sẽ giúp bạn viết mã Go hiệu quả và dễ bảo trì hơn.