Go Maps: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 14: Line 14:
=Declaration and Initialization=
=Declaration and Initialization=
==Initialization with <tt>make()</tt>==
==Initialization with <tt>make()</tt>==
<code>make()</code> allocates a the underlying data structures required by the map, and creates a new map header to describe it, all at once. Note that unlike <code>[[#new()|new()]]</code>, <code>make()</code> returns the map, not a pointer. The returned map is empty, but ready to use.
<syntaxhighlight lang='go'>
mm := make([string]int)
</syntaxhighlight>
==<span id='Composite_Literal'></span>Initialization with a Composite Literal==
==<span id='Composite_Literal'></span>Initialization with a Composite Literal==
Composite literals can be used for map initialization.  
Composite literals can be used for map initialization.  

Revision as of 00:05, 27 August 2024

External

Internal

Overview

Maps and Pass-by-Value

Pointers to Maps

nil and Empty Map

nil Map

Empty Map

Declaration and Initialization

Initialization with make()

make() allocates a the underlying data structures required by the map, and creates a new map header to describe it, all at once. Note that unlike new(), make() returns the map, not a pointer. The returned map is empty, but ready to use.

mm := make([string]int)

Initialization with a Composite Literal

Composite literals can be used for map initialization.

Long variable declaration and initialization with type inference:

var mm = map[string]int{"A": 1, "B": 2}

Short variable declaration:

mm := map[string]int{"A": 1, "B": 2}

Operators

Indexing Operator []

Values stored in a map can be referenced with the indexing operator [], using the [key] syntax.

The indexing operator returns two values: a copy of the value associated with the key, or the zero-value for the map type if the key does not exist in map, and a boolean that says whether the key exists or not in the map.

The second returned value can be syntactically omitted, but given the fact that the indexing operator returns the zero value for the type and not nil on missing keys, it is impossible to say without it whether the key is missing, or a zero-value was associated with the key.

mm := map[string]int{"A": 1, "B": 2}
v, ok := mm["A"]
fmt.Printf("%d, %t\n", v, ok) // will display 1, true

Idiom:

if v, ok := mm["A"]; ok {
  // use the value
}

If the key does not exist in map, the retuned value is not nil, but the zero value for the type.

The indexing operator can be used to change the value associated with a key, or to add a new key/value pair:

mm["A"] = 7
mm["C"] = 9

Map Functions

delete()

delete() is a built-in function that deletes a key/value pair from the map:

mm := map[string]int{"A": 1, "B": 2}
delete(mm, "A")

If the key does not exist in the map, delete() is a no-op.

len()

len() is a built-in function that returns the number of keys in the map. Note that the built-in cap() function does not work on maps. Unlike slices, maps do not have the concept of capacity.

make()

make() is a built-in function that creates ready-to-use map. See Initialization with make() above.

new()

Iterating over a Map

Use the range keyword.

for k, v := range mm {
    fmt.Printf("%s=%d\n", k, v)
}

TODO

Go_Maps_TODEPLETE