Thứ Tư, 22 tháng 4, 2020

[Golang] Map


I. Khái niệm về Map


Map là một built-in Type trong golang. Map associate một value tới một key. Value có thể được retrieved bằng cách sử dụng key tương ứng.

II. How to create a Map


Map có thể được tạo bằng 2 cách:

1. Tạo Map với make function


Syntax

map := make(map[key-type]value-type)

Ví dụ:

personSalary := make(map[string]int)

với cú pháp trên, ta vừa tạo một map personSalary với key là string và value dạng int

Zero value của Map là nil. Nếu chúng ta add một item vào một nil map, sẽ gây panic. Vì vậy, ta phải khởi tạo initialized map  với make trước khi sử dụng.

2. Short hand declaration



Ta có thể tạo một map bằng cách gọi trực tiếp
map := map[string]int{ "key": 1 }

III. Adding items vaò map


Có thể add items vào map dựa vào cấu trúc sau:

map[key] = value

Ví dụ:
package main

import (  
    "fmt"
)

func main() {  
    personSalary := make(map[string]int)
    personSalary[" person1"] = 12000
    personSalary["person2"] = 15000    personSalary["person3"] = 9000    fmt.Println("personSalary map contents:", personSalary)
}st

Run chương trình trên, output sẽ như sau:

personSalary map contents: map[person1:12000 person2:15000 person3:9000]

Những type nào có thể sử dụng làm key của một map?


Tất cả những comparable type như: bolean, integer, float, string, comflex ... đều có thể sử dụng làm key của một map.

Key của một map là không thể trùng nhau.

IV. Accessing items của map


Value của map được retrieved using key tương ứng

value := map[key] 

Chuyện gì sẽ xảy nếu một key được retrieved không tồn tại?


Khi đó, value được trả về sẽ là zero value của key đó. Ví dụ "" với key là string, 0 với key là int ...


package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "person1": 12000,
        "person2": 15000,    }
    personSalary["person3"] = 9000    employee := "person1"    fmt.Println("Salary of", employee, "is", personSalary[employee])
    fmt.Println("Salary of person4 is", personSalary["person4"])}

khi đó, output sẽ trả về:

Salary of person1 is 15000  
Salary of person4 is 0 

Làm thế nào chúng ta biết được một key có nằm trong map đó hay không?


Check với syntax sau:


value, ok := map[key]  

  • Nếu key nằm trong map, ok sẽ trả về true
  • Nêú key không nằm trong map, ok sẽ trả về false


Để iterate all items in map, sử dụng range form của for loop 

package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "person1": 12000,        "person2": 15000,    }
    personSalary["person3"] = 9000    fmt.Println("All items of a map")
    for key, value := range personSalary {
        fmt.Printf("personSalary[%s] = %d\n", key, value)
    }

}

Output của chương trình trên:
All items of a map  
personSalary[person1] = 9000  
personSalary[person2] = 12000  
personSalary[person3] = 15000  

V. Deleting Item trong một map


Sử dụng delete func với syntax sau:
delete(map, key) 

VI. Length của một map



length của map có thể được xác đinh bởi len() func

len(map) 


VII. Map là một reference Type


Giống như slice, Map là một reference type. Nghĩa là, khi map được assign tới một value, cả hai đối tượng sẽ được point tới cùng một internal data structure. Vì vậy, khi ta thay đổi biến hoặc map, đối tượng còn lại sẽ thay đổi theo

package main

import (  
    "fmt"
)

func main() {  
    personSalary := map[string]int{
        "person1": 12000,
        "person2": 15000,    }
    personSalary["person3"] = 9000    fmt.Println("Original person salary", personSalary)
    newPersonSalary := personSalary
    newPersonSalary["person3"] = 18000    fmt.Println("Person salary changed", personSalary)

}

Trong chương trình trên, personSalary sẽ được assign tới newPersonSalary. vì vậy, khi ta thay đổi newPersonSalary, personSalary cũng sẽ thay đổi theo.

Output của chương trình sẽ là:
Original person salary map[person1:12000 person2:15000 person3:9000]  
Person salary changed map[person1:12000 person2:15000 person3:18000]

VIII. Làm thế nào để compare hai map với nhau?


Hai map không thể compare sử dụng dấu ==.  == chỉ được sử dụng để check khi map là nil.
Để check hai map bằng nhau, chúng ta chỉ có thể check lần lượt từng phần tử trong mỗi map là bằng nhau, one by one



Không có nhận xét nào:

Đăng nhận xét