Introduce
Hello everyone, let’s continue learning Go on day 2. Let’s go!!!
Content
Pointers
Pointer is a variable that holds the address of an area in memory. Instead of storing the value directly into the variable, we can store the address of that value and use the pointer to access that value. Using pointers in Go can help improve performance and save memory compared to copying data between variables.
To create a pointer, you use the “&” operator to get the address of a variable, and the “*” operator to access the value at that address.
syntax:
- “&” operator:123i <span class="token operator">:=</span> <span class="token number">42</span>p <span class="token operator">=</span> <span class="token operator">&</span> i
- Operator “*” :12g <span class="token operator">:=</span> <span class="token operator">*</span> p
For example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">import</span> <span class="token string">"fmt"</span> <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> i <span class="token punctuation">,</span> j <span class="token operator">:=</span> <span class="token number">42</span> <span class="token punctuation">,</span> <span class="token number">2701</span> p <span class="token operator">:=</span> <span class="token operator">&</span> i <span class="token comment">// point trỏ tới địa chỉ ô nhớ của i</span> fmt <span class="token punctuation">.</span> <span class="token function">Println</span> <span class="token punctuation">(</span> <span class="token operator">*</span> p <span class="token punctuation">)</span> <span class="token comment">// kết quả => 42</span> <span class="token operator">*</span> p <span class="token operator">=</span> <span class="token number">21</span> <span class="token comment">// gán giá trị vào ô nhớ</span> fmt <span class="token punctuation">.</span> <span class="token function">Println</span> <span class="token punctuation">(</span> i <span class="token punctuation">)</span> <span class="token comment">// kết quả => 21</span> p <span class="token operator">=</span> <span class="token operator">&</span> j <span class="token comment">// gán point trỏ tới địa chỉ ô nhớ của j</span> <span class="token operator">*</span> p <span class="token operator">=</span> <span class="token operator">*</span> p <span class="token operator">/</span> <span class="token number">37</span> <span class="token comment">// gán giá trị vào ô nhớ</span> fmt <span class="token punctuation">.</span> <span class="token function">Println</span> <span class="token punctuation">(</span> j <span class="token punctuation">)</span> <span class="token comment">// kết quả => 73</span> <span class="token punctuation">}</span> |
Structs
Struct is a composite data type that allows you to define a collection of fields of different data types. It helps you organize and store related data together in the same object.
1 2 3 4 5 6 7 8 9 | <span class="token keyword">type</span> Vertex <span class="token keyword">struct</span> <span class="token punctuation">{</span> X <span class="token builtin">int</span> Y <span class="token builtin">int</span> <span class="token punctuation">}</span> <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> fmt <span class="token punctuation">.</span> <span class="token function">Println</span> <span class="token punctuation">(</span> Vertex <span class="token punctuation">{</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
We can create a Vertex object by assigning values to the data fields of the struct.
1 2 3 4 5 | vertex <span class="token operator">:=</span> Vertex <span class="token punctuation">{</span> Y <span class="token punctuation">:</span> <span class="token number">100</span> <span class="token punctuation">,</span> X <span class="token punctuation">:</span> <span class="token number">200</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> |
We can access and assign values to the data fields of a struct using the “.” .
1 2 3 | vertex <span class="token punctuation">.</span> Y <span class="token operator">=</span> <span class="token number">200</span> vertex <span class="token punctuation">.</span> X <span class="token operator">=</span> <span class="token number">300</span> |
We can access and modify the contents of the struct using Pointer.
1 2 3 4 | v <span class="token operator">:=</span> Vertex <span class="token punctuation">{</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">}</span> p <span class="token operator">:=</span> <span class="token operator">&</span> v p <span class="token punctuation">.</span> X <span class="token operator">=</span> <span class="token number">400</span> |
Arrays
An array is declared by specifying the type of data to be stored and the length of the array.
Syntax:
1 2 | <span class="token keyword">var</span> <span class="token operator"><</span> name <span class="token operator">></span> <span class="token punctuation">[</span> lenght <span class="token punctuation">]</span> <span class="token operator"><</span> <span class="token keyword">type</span> <span class="token operator">></span> |
e.g. Create array a of length 10 with elements of type int.
1 2 | <span class="token keyword">var</span> a <span class="token punctuation">[</span> <span class="token number">10</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> |
Note: Once declared, the length and data type of the array cannot be changed. If you want to change the length, you have to create a new array and copy the data from the old array.
Zero value
When declaring an array without assigning a value, all elements will be assigned a default value according to the data type (int = 0, string = “”).
For example, array [5]int will have all elements with value 0.
Literal
1 2 | array <span class="token operator">:=</span> <span class="token punctuation">[</span> <span class="token number">5</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token number">10</span> <span class="token punctuation">,</span> <span class="token number">20</span> <span class="token punctuation">,</span> <span class="token number">30</span> <span class="token punctuation">,</span> <span class="token number">40</span> <span class="token punctuation">,</span> <span class="token number">50</span> <span class="token punctuation">}</span> |
Calculating Size
If the length is given as “…” , Go will determine the length of the array based on the number of initialized elements.
1 2 | array <span class="token operator">:=</span> <span class="token punctuation">[</span> <span class="token operator">...</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token number">10</span> <span class="token punctuation">,</span> <span class="token number">20</span> <span class="token punctuation">,</span> <span class="token number">30</span> <span class="token punctuation">,</span> <span class="token number">40</span> <span class="token punctuation">,</span> <span class="token number">50</span> <span class="token punctuation">}</span> |
Specific elements
If you know the length of the array you need, but only initialize specific elements, you can use this syntax.
1 2 | array <span class="token operator">:=</span> <span class="token punctuation">[</span> <span class="token number">5</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token number">1</span> <span class="token punctuation">:</span> <span class="token number">10</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">:</span> <span class="token number">20</span> <span class="token punctuation">}</span> |
Pointer elements
You can have an array of pointers. You use the * operator to access the value of each pointer the element points to.
1 2 3 4 5 | array <span class="token operator">:=</span> <span class="token punctuation">[</span> <span class="token number">5</span> <span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token number">0</span> <span class="token punctuation">:</span> <span class="token function">new</span> <span class="token punctuation">(</span> <span class="token builtin">int</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">:</span> <span class="token function">new</span> <span class="token punctuation">(</span> <span class="token builtin">int</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token operator">*</span> array <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">10</span> <span class="token operator">*</span> array <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">20</span> |
The values of the array declared in the array look like the image below:
An array is a value in Go. This means you can use it in an assignment operation. Thus, an array can be assigned to other arrays of the same type and length.
1 2 3 4 | <span class="token keyword">var</span> array1 <span class="token punctuation">[</span> <span class="token number">5</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> array2 <span class="token operator">:=</span> <span class="token punctuation">[</span> <span class="token number">5</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">}</span> array1 <span class="token operator">=</span> array2 |
As for Pointer, when we assign, we assign the memory cell addresses of the pointer, not the values that the pointer is pointing to.
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">var</span> array1 <span class="token punctuation">[</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token builtin">string</span> array2 <span class="token operator">:=</span> <span class="token punctuation">[</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token function">new</span> <span class="token punctuation">(</span> <span class="token builtin">string</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token function">new</span> <span class="token punctuation">(</span> <span class="token builtin">string</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token function">new</span> <span class="token punctuation">(</span> <span class="token builtin">string</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token operator">*</span> array2 <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Red"</span> <span class="token operator">*</span> array2 <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Blue"</span> <span class="token operator">*</span> array2 <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Green"</span> array1 <span class="token operator">=</span> array2 |
It looks like the image below:
Multidimensional array (multidimensional array)
Multidimensional is a data structure that allows to store elements as a multidimensional table. Each element in a multidimensional array is identified by multiple indices called indexes.
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token comment">// initialize</span> <span class="token keyword">var</span> array <span class="token punctuation">[</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token comment">// literal & initialize</span> array <span class="token operator">:=</span> <span class="token punctuation">[</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> <span class="token number">10</span> <span class="token punctuation">,</span> <span class="token number">11</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token number">20</span> <span class="token punctuation">,</span> <span class="token number">21</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token number">30</span> <span class="token punctuation">,</span> <span class="token number">31</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token number">40</span> <span class="token punctuation">,</span> <span class="token number">41</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// Declare & initialize outer array</span> array <span class="token operator">:=</span> <span class="token punctuation">[</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token number">1</span> <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token number">20</span> <span class="token punctuation">,</span> <span class="token number">21</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token number">40</span> <span class="token punctuation">,</span> <span class="token number">41</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// Declare & initialize outer and inner array</span> array <span class="token operator">:=</span> <span class="token punctuation">[</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token number">1</span> <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token number">0</span> <span class="token punctuation">:</span> <span class="token number">20</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token number">1</span> <span class="token punctuation">:</span> <span class="token number">41</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Like the picture below:
Passing arrays between functions
When passing an array between functions, it can take a lot of memory and affect performance. Arrays are passed by copying the entire array to the function regardless of its size.
1 2 3 4 5 6 7 8 9 | <span class="token comment">// Khai báo 1 mảng 8 megabytes.</span> <span class="token keyword">var</span> num <span class="token punctuation">[</span> <span class="token number">1e6</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token function">handleNum</span> <span class="token punctuation">(</span> num <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">handleNum</span> <span class="token punctuation">(</span> num <span class="token punctuation">[</span> <span class="token number">1e6</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span> |
When calling handleNum with an array of 8 megabytes , the entire array will be copied and allocated on the stack, which consumes a lot of memory and affects performance. The better way is to pass a pointer to the array and let just copy 8 bytes .
1 2 3 4 5 6 7 8 | <span class="token keyword">var</span> num <span class="token punctuation">[</span> <span class="token number">1e6</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token function">handleNum</span> <span class="token punctuation">(</span> <span class="token operator">&</span> num <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">handleNum</span> <span class="token punctuation">(</span> num <span class="token operator">*</span> <span class="token punctuation">[</span> <span class="token number">1e6</span> <span class="token punctuation">]</span> <span class="token builtin">int</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span> |
summary
So after 1 day I learned:
- Pointers
- Structs
- Arrays
If you have any questions or need further clarification, you can comment below. Thank you for following my post. Wish you have a nice day. Tks