Continuing my series of data structures in Go . Today, I will show you how to use Maps , and this is also the last article in the series of commonly used data structures that I want to introduce to you. You can review Part 1 Arrays and Part 2 Slices here.
1. Concepts
A map is a data structure that provides the programmer with an unordered collection of key / value pairs. You store values in the map based on the key. The advantage of the map is its ability to get value quickly based on the key . The key works like an index , indicating the value being associated with the key .
2. Basic principles
Maps is a gallery, you can repeat it just like you would with arrays and slices . But maps are unordered collection so there is no way to predict the order in which key / value pairs will be returned. Even if you store key / value pairs in the same order, each time you iterate over the map it may get a different order. This happens because map implements hash table (you can learn more about hash table to understand. Details about hash table, I will write another article).
3. Declare and initialize
There are several ways to declare which maps are created in Go . You can use the make
function or use map literal .
1 2 3 4 5 6 | <span class="token comment">// Tạo một map với key có kiểu string và value có kiểu int.</span> dict <span class="token operator">:=</span> <span class="token function">make</span> <span class="token punctuation">(</span> <span class="token keyword">map</span> <span class="token punctuation">[</span> <span class="token builtin">string</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token punctuation">)</span> <span class="token comment">// Tạo mới một map với key có kiểu string và value có kiểu string.</span> dict <span class="token operator">:=</span> <span class="token keyword">map</span> <span class="token punctuation">[</span> <span class="token builtin">string</span> <span class="token punctuation">]</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token string">"Red"</span> <span class="token punctuation">:</span> <span class="token string">"#da1337"</span> <span class="token punctuation">,</span> <span class="token string">"Orange"</span> <span class="token punctuation">:</span> <span class="token string">"#e95a22"</span> <span class="token punctuation">}</span> |
Using map literal is a way to create a new map . The length of the map will be based on the number of key / value pairs that you initialized when creating a new map . The key of the map can be a primitive type or a struct type defined by the user, but the == operator must be met. Slices, functions, and structs contain slices that cannot be used as map keys
4. Working with maps
Assigning a key / value pair to map is done by specifying a key and assigning a value to that key
1 2 3 4 5 | <span class="token comment">// Tạo mới một map rỗng để lưu chữ màu và mã màu.</span> colors <span class="token operator">:=</span> <span class="token keyword">map</span> <span class="token punctuation">[</span> <span class="token builtin">string</span> <span class="token punctuation">]</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> colors <span class="token punctuation">[</span> <span class="token string">"Red"</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"#da1337"</span> |
You can also create a nil
map by declaring map without initializing it. Note , a nil
map cannot be used to store key / value pairs.
1 2 3 4 5 6 7 8 9 | <span class="token comment">// Tạo mới một map nil</span> <span class="token keyword">var</span> colors <span class="token keyword">map</span> <span class="token punctuation">[</span> <span class="token builtin">string</span> <span class="token punctuation">]</span> <span class="token builtin">string</span> <span class="token comment">// Thêm mới color vào map</span> colors <span class="token punctuation">[</span> <span class="token string">"Red"</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"#da1337"</span> Runtime Error <span class="token punctuation">:</span> <span class="token builtin">panic</span> <span class="token punctuation">:</span> runtime <span class="token builtin">error</span> <span class="token punctuation">:</span> assignment to entry in <span class="token boolean">nil</span> <span class="token keyword">map</span> |
It is important to check whether a key already exists or not when using maps . It allows you to write logic to determine whether you have performed an operation or if you have stored values in the map . It is also used to compare two maps to determine which key / value pairs match or are missing.
When getting values from a map , you have two options. You can get a value and a flag indicating whether the key already exists or not.
1 2 3 4 5 6 7 8 | <span class="token comment">// Nhận được giá trị của key "Blue".</span> value <span class="token punctuation">,</span> exists <span class="token operator">:=</span> colors <span class="token punctuation">[</span> <span class="token string">"Blue"</span> <span class="token punctuation">]</span> <span class="token comment">// Nếu key đã tồn tại?</span> <span class="token keyword">if</span> exists <span class="token punctuation">{</span> fmt <span class="token punctuation">.</span> <span class="token function">Println</span> <span class="token punctuation">(</span> value <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Another option is that it just returns the value and checks that value to determine if the key exists or not. This can only work if the value 0 is not a valid value in the map .
1 2 3 4 5 6 7 8 | <span class="token comment">// Nhận được giá trị của key "Blue".</span> value <span class="token operator">:=</span> colors <span class="token punctuation">[</span> <span class="token string">"Blue"</span> <span class="token punctuation">]</span> <span class="token comment">// Nếu key đã tồn tại?</span> <span class="token keyword">if</span> value <span class="token operator">!=</span> <span class="token string">""</span> <span class="token punctuation">{</span> fmt <span class="token punctuation">.</span> <span class="token function">Println</span> <span class="token punctuation">(</span> value <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
When you access a map using the index in Go , it will always return a value, even if the key doesn’t exist. In this case, the value 0 is returned.
Loop on map is like looping on arrays or slices. You use the keyword range
; but for map, you cannot get the index / value. Instead, you will get key / value pair.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token comment">// Tạo một map màu sắc</span> colors <span class="token operator">:=</span> <span class="token keyword">map</span> <span class="token punctuation">[</span> <span class="token builtin">string</span> <span class="token punctuation">]</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token string">"AliceBlue"</span> <span class="token punctuation">:</span> <span class="token string">"#f0f8ff"</span> <span class="token punctuation">,</span> <span class="token string">"Coral"</span> <span class="token punctuation">:</span> <span class="token string">"#ff7F50"</span> <span class="token punctuation">,</span> <span class="token string">"DarkGray"</span> <span class="token punctuation">:</span> <span class="token string">"#a9a9a9"</span> <span class="token punctuation">,</span> <span class="token string">"ForestGreen"</span> <span class="token punctuation">:</span> <span class="token string">"#228b22"</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token comment">// Hiển thị tất cả màu sắc trong map.</span> <span class="token keyword">for</span> key <span class="token punctuation">,</span> value <span class="token operator">:=</span> <span class="token keyword">range</span> colors <span class="token punctuation">{</span> fmt <span class="token punctuation">.</span> <span class="token function">Printf</span> <span class="token punctuation">(</span> <span class="token string">"Key: %s Value: %sn"</span> <span class="token punctuation">,</span> key <span class="token punctuation">,</span> value <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
If you want to delete a key / value pair from a map , you use the delete
function provided by Go .
1 2 3 4 5 6 7 8 | <span class="token comment">// Xoá một cặp key/value</span> <span class="token function">delete</span> <span class="token punctuation">(</span> colors <span class="token punctuation">,</span> <span class="token string">"Coral"</span> <span class="token punctuation">)</span> <span class="token comment">// Hiển thị tất cả màu sắc trong map.</span> <span class="token keyword">for</span> key <span class="token punctuation">,</span> value <span class="token operator">:=</span> <span class="token keyword">range</span> colors <span class="token punctuation">{</span> fmt <span class="token punctuation">.</span> <span class="token function">Printf</span> <span class="token punctuation">(</span> <span class="token string">"Key: %s Value: %sn"</span> <span class="token punctuation">,</span> key <span class="token punctuation">,</span> value <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
This time, when you loop on the map, you will not see the Coral
color on the screen.
5. Pass the map between functions
Passing a map between two functions will not create a copy of it. In fact, you could pass a map to a map modifier function that will be seen on all maps that reference it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <span class="token keyword">func</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Create a map of colors and color hex codes.</span> colors <span class="token operator">:=</span> <span class="token keyword">map</span> <span class="token punctuation">[</span> <span class="token builtin">string</span> <span class="token punctuation">]</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token string">"AliceBlue"</span> <span class="token punctuation">:</span> <span class="token string">"#f0f8ff"</span> <span class="token punctuation">,</span> <span class="token string">"Coral"</span> <span class="token punctuation">:</span> <span class="token string">"#ff7F50"</span> <span class="token punctuation">,</span> <span class="token string">"DarkGray"</span> <span class="token punctuation">:</span> <span class="token string">"#a9a9a9"</span> <span class="token punctuation">,</span> <span class="token string">"ForestGreen"</span> <span class="token punctuation">:</span> <span class="token string">"#228b22"</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token comment">// Hiển thị tất cả màu trong map.</span> <span class="token keyword">for</span> key <span class="token punctuation">,</span> value <span class="token operator">:=</span> <span class="token keyword">range</span> colors <span class="token punctuation">{</span> fmt <span class="token punctuation">.</span> <span class="token function">Printf</span> <span class="token punctuation">(</span> <span class="token string">"Key: %s Value: %sn"</span> <span class="token punctuation">,</span> key <span class="token punctuation">,</span> value <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// Xoá một màu được chỉ định trong map</span> <span class="token function">removeColor</span> <span class="token punctuation">(</span> colors <span class="token punctuation">,</span> <span class="token string">"Coral"</span> <span class="token punctuation">)</span> <span class="token comment">// Hiển thị tất cả màu trong map.</span> <span class="token keyword">for</span> key <span class="token punctuation">,</span> value <span class="token operator">:=</span> <span class="token keyword">range</span> colors <span class="token punctuation">{</span> fmt <span class="token punctuation">.</span> <span class="token function">Printf</span> <span class="token punctuation">(</span> <span class="token string">"Key: %s Value: %sn"</span> <span class="token punctuation">,</span> key <span class="token punctuation">,</span> value <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// removeColor xoá một key từ map</span> <span class="token keyword">func</span> <span class="token function">removeColor</span> <span class="token punctuation">(</span> colors <span class="token keyword">map</span> <span class="token punctuation">[</span> <span class="token builtin">string</span> <span class="token punctuation">]</span> <span class="token builtin">string</span> <span class="token punctuation">,</span> key <span class="token builtin">string</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">delete</span> <span class="token punctuation">(</span> colors <span class="token punctuation">,</span> key <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
If you execute the above program, you will see the following output:
1 2 3 4 5 6 7 8 9 | Key <span class="token punctuation">:</span> AliceBlue Value <span class="token punctuation">:</span> #F0F8FF Key <span class="token punctuation">:</span> Coral Value <span class="token punctuation">:</span> #FF7F50 Key <span class="token punctuation">:</span> DarkGray Value <span class="token punctuation">:</span> #A9A9A9 Key <span class="token punctuation">:</span> ForestGreen Value <span class="token punctuation">:</span> # <span class="token number">228</span> B22 Key <span class="token punctuation">:</span> AliceBlue Value <span class="token punctuation">:</span> #F0F8FF Key <span class="token punctuation">:</span> DarkGray Value <span class="token punctuation">:</span> #A9A9A9 Key <span class="token punctuation">:</span> ForestGreen Value <span class="token punctuation">:</span> # <span class="token number">228</span> B22 |
You can see, after the removeColor function was executed, the Coral
color no longer exists in the map referenced in the main
function. Maps is designed like slices in this point.
My article on Maps is quite brief. However, if you want to learn more, you can learn more techniques below, you can learn about hash tables . Thank you for reading my article. If you have any questions, don’t hesitate to leave a comment.
Link to the original article here, guys: https://chiasekienthuc.netlify.app/blog/maps