|  | 
| 1 | 1 | // All material is licensed under the Apache License Version 2.0, January 2004 | 
| 2 | 2 | // http://www.apache.org/licenses/LICENSE-2.0 | 
| 3 | 3 | 
 | 
| 4 |  | -// Sample program to show how to declare and initialize a map | 
| 5 |  | -// using a map literal and delete a key. | 
|  | 4 | +// Sample program to show how maps behave when you read an | 
|  | 5 | +// absent key. | 
| 6 | 6 | package main | 
| 7 | 7 | 
 | 
| 8 | 8 | import "fmt" | 
| 9 | 9 | 
 | 
| 10 |  | -// user defines a user in the program. | 
| 11 |  | -type user struct { | 
| 12 |  | -	name    string | 
| 13 |  | -	surname string | 
| 14 |  | -} | 
| 15 |  | - | 
| 16 | 10 | func main() { | 
| 17 | 11 | 
 | 
| 18 |  | -	// Declare and initialize the map with values. | 
| 19 |  | -	users := map[string]user{ | 
| 20 |  | -		"Roy":     {"Rob", "Roy"}, | 
| 21 |  | -		"Ford":    {"Henry", "Ford"}, | 
| 22 |  | -		"Mouse":   {"Mickey", "Mouse"}, | 
| 23 |  | -		"Jackson": {"Michael", "Jackson"}, | 
| 24 |  | -	} | 
|  | 12 | +	// Create a map to track scores for players in a game. | 
|  | 13 | +	scores := make(map[string]int) | 
| 25 | 14 | 
 | 
| 26 |  | -	// Iterate over the map. | 
| 27 |  | -	for key, value := range users { | 
| 28 |  | -		fmt.Println(key, value) | 
| 29 |  | -	} | 
|  | 15 | +	// Read the element at key "anna". It is absent so we get | 
|  | 16 | +	// the zero-value for this map's value type. | 
|  | 17 | +	score := scores["anna"] | 
| 30 | 18 | 
 | 
| 31 |  | -	// Delete the Roy key. | 
| 32 |  | -	delete(users, "Roy") | 
|  | 19 | +	fmt.Println("Score:", score) | 
| 33 | 20 | 
 | 
| 34 |  | -	fmt.Println("=================") | 
|  | 21 | +	// If we need to check for the presence of a key we use | 
|  | 22 | +	// a 2 variable assignment. The 2nd variable is a bool. | 
|  | 23 | +	score, ok := scores["anna"] | 
| 35 | 24 | 
 | 
| 36 |  | -	// Find the Roy key. | 
| 37 |  | -	u, found := users["Roy"] | 
|  | 25 | +	fmt.Println("Score:", score, "Present:", ok) | 
|  | 26 | + | 
|  | 27 | +	// We can leverage the zero-value behavior to write | 
|  | 28 | +	// convenient code like this: | 
|  | 29 | +	scores["anna"]++ | 
|  | 30 | + | 
|  | 31 | +	// Without this behavior we would have to code in a | 
|  | 32 | +	// defensive way like this: | 
|  | 33 | +	if n, ok := scores["anna"]; ok { | 
|  | 34 | +		scores["anna"] = n + 1 | 
|  | 35 | +	} else { | 
|  | 36 | +		scores["anna"] = 1 | 
|  | 37 | +	} | 
| 38 | 38 | 
 | 
| 39 |  | -	// Display the value and found flag. | 
| 40 |  | -	fmt.Println("Roy", found, u) | 
|  | 39 | +	score, ok = scores["anna"] | 
|  | 40 | +	fmt.Println("Score:", score, "Present:", ok) | 
| 41 | 41 | } | 
0 commit comments