Khóa học go

Maps trong Go Lang

0 phút đọc

Maps là một cấu trúc dữ liệu quan trọng trong Go, cho phép lưu trữ các cặp khóa-giá trị (key-value pairs). Maps rất hữu ích khi bạn cần truy cập dữ liệu dựa trên một khóa duy nhất. Bài viết này sẽ cung cấp một cái nhìn tổng quan chi tiết về maps 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 Maps

Maps là một tập hợp các cặp khóa-giá trị, trong đó mỗi khóa là duy nhất và được liên kết với một giá trị. Maps trong Go được triển khai dưới dạng hash table, cho phép truy cập và thao tác dữ liệu một cách nhanh chóng.

Cú Pháp Khai Báo Maps

Có nhiều cách để khai báo và khởi tạo maps trong Go.

Sử Dụng Từ Khóa make

Cú pháp khai báo maps sử dụng từ khóa make như sau:

go Copy
map_name := make(map[KeyType]ValueType)

Trong đó:

  • map_name là tên của map.
  • KeyType là kiểu dữ liệu của khóa.
  • ValueType là kiểu dữ liệu của giá trị.

Ví Dụ:

go Copy
package main

import "fmt"

func main() {
    var myMap = make(map[string]int)
    fmt.Println(myMap) // Output: map[]
}

Sử Dụng Map Literal

Bạn có thể khai báo và khởi tạo một map với các cặp khóa-giá trị ban đầu bằng cách sử dụng cú pháp map literal.

Ví Dụ:

go Copy
package main

import "fmt"

func main() {
    myMap := map[string]int{
        "Alice": 25,
        "Bob":   30,
        "Carol": 35,
    }
    fmt.Println(myMap) // Output: map[Alice:25 Bob:30 Carol:35]
}

Truy Cập và Thay Đổi Giá Trị trong Maps

Bạn có thể truy cập và thay đổi các giá trị trong map bằng cách sử dụng khóa của chúng.

Ví Dụ:

go Copy
package main

import "fmt"

func main() {
    myMap := map[string]int{
        "Alice": 25,
        "Bob":   30,
        "Carol": 35,
    }

    // Truy cập giá trị
    fmt.Println(myMap["Alice"]) // Output: 25

    // Thay đổi giá trị
    myMap["Alice"] = 26
    fmt.Println(myMap["Alice"]) // Output: 26
}

Thêm và Xóa Cặp Khóa-Giá Trị trong Maps

Thêm Cặp Khóa-Giá Trị

Bạn có thể thêm một cặp khóa-giá trị mới vào map bằng cách sử dụng cú pháp gán giá trị.

Ví Dụ:

go Copy
package main

import "fmt"

func main() {
    myMap := make(map[string]int)
    myMap["Alice"] = 25
    myMap["Bob"] = 30

    fmt.Println(myMap) // Output: map[Alice:25 Bob:30]
}

Xóa Cặp Khóa-Giá Trị

Bạn có thể xóa một cặp khóa-giá trị khỏi map bằng cách sử dụng hàm delete.

Ví Dụ:

go Copy
package main

import "fmt"

func main() {
    myMap := map[string]int{
        "Alice": 25,
        "Bob":   30,
        "Carol": 35,
    }

    // Xóa cặp khóa-giá trị
    delete(myMap, "Bob")
    fmt.Println(myMap) // Output: map[Alice:25 Carol:35]
}

Kiểm Tra Sự Tồn Tại của Khóa

Bạn có thể kiểm tra xem một khóa có tồn tại trong map hay không bằng cách sử dụng cú pháp gán giá trị và kiểm tra giá trị boolean trả về.

Ví Dụ:

go Copy
package main

import "fmt"

func main() {
    myMap := map[string]int{
        "Alice": 25,
        "Bob":   30,
    }

    // Kiểm tra sự tồn tại của khóa
    value, exists := myMap["Alice"]
    if exists {
        fmt.Println("Alice exists with value:", value) // Output: Alice exists with value: 25
    } else {
        fmt.Println("Alice does not exist")
    }

    value, exists = myMap["Carol"]
    if exists {
        fmt.Println("Carol exists with value:", value)
    } else {
        fmt.Println("Carol does not exist") // Output: Carol does not exist
    }
}

Duyệt Qua Các Cặp Khóa-Giá Trị trong Maps

Bạn có thể sử dụng vòng lặp for range để duyệt qua các cặp khóa-giá trị trong map.

Ví Dụ:

go Copy
package main

import "fmt"

func main() {
    myMap := map[string]int{
        "Alice": 25,
        "Bob":   30,
        "Carol": 35,
    }

    // Duyệt qua các cặp khóa-giá trị
    for key, value := range myMap {
        fmt.Printf("%s: %d\n", key, value)
    }
}

Maps Lồng Nhau

Go cho phép bạn tạo các maps lồng nhau, tức là một map có thể chứa các maps khác làm giá trị.

Ví Dụ:

go Copy
package main

import "fmt"

func main() {
    myMap := map[string]map[string]int{
        "Group1": {
            "Alice": 25,
            "Bob":   30,
        },
        "Group2": {
            "Carol": 35,
            "Dave":  40,
        },
    }

    // Duyệt qua các maps lồng nhau
    for group, members := range myMap {
        fmt.Println("Group:", group)
        for name, age := range members {
            fmt.Printf("  %s: %d\n", name, age)
        }
    }
}

Maps và Structs

Bạn có thể sử dụng maps kết hợp với structs để tạo ra các cấu trúc dữ liệu phức tạp hơn.

Ví Dụ:

go Copy
package main

import "fmt"

type Person struct {
    Age  int
    City string
}

func main() {
    myMap := map[string]Person{
        "Alice": {25, "New York"},
        "Bob":   {30, "San Francisco"},
    }

    // Duyệt qua các cặp khóa-giá trị
    for name, person := range myMap {
        fmt.Printf("%s: Age=%d, City=%s\n", name, person.Age, person.City)
    }
}

Maps và Hàm

Bạn có thể truyền maps vào hàm và trả về maps từ hàm.

Truyền Maps vào Hàm

Ví Dụ:

go Copy
package main

import "fmt"

func printMap(m map[string]int) {
    for key, value := range m {
        fmt.Printf("%s: %d\n", key, value)
    }
}

func main() {
    myMap := map[string]int{
        "Alice": 25,
        "Bob":   30,
    }
    printMap(myMap)
}

Trả Về Maps từ Hàm

Ví Dụ:

go Copy
package main

import "fmt"

func createMap() map[string]int {
    return map[string]int{
        "Alice": 25,
        "Bob":   30,
    }
}

func main() {
    myMap := createMap()
    fmt.Println(myMap) // Output: map[Alice:25 Bob:30]
}

Maps và Hiệu Suất

Maps trong Go được triển khai dưới dạng hash table, cho phép truy cập và thao tác dữ liệu một cách nhanh chóng. Tuy nhiên, bạn cần lưu ý rằng việc sử dụng maps có thể tốn kém về bộ nhớ nếu số lượng cặp khóa-giá trị rất lớn.

Kết Luận

Maps là một cấu trúc dữ liệu mạnh mẽ và linh hoạt trong Go, cho phép bạn lưu trữ và truy cập các cặp khóa-giá trị một cách hiệu quả. Bài viết này đã cung cấp một cái nhìn tổng quan chi tiết về maps 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ề maps sẽ giúp bạn viết mã Go hiệu quả và dễ bảo trì hơn.

Avatar
Được viết bởi

Admin Team

Gợi ý câu hỏi phỏng vấn

Không có dữ liệu

Không có dữ liệu

Gợi ý bài viết
Không có dữ liệu

Không có dữ liệu

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào