# Arrays, Slices, and Maps ## Basic Syntax ### Composite types The array and the slice are like a string, it is the sequence of things literally laid down in memory one after another. The map is a map of keys to values. - string ```bash "area" ``` - array ```bash [4]int 1, 12, 4, 8 ``` Arrays are not used a lot since they are fixed size. - slice (variable length array) ```bash []int 1, 13, 3, ..., 17 ``` -map ```bash map[string]int "to": 1 "from": 12 "into": 3 "above": 0 ``` ### Array Arrays are passed by value, thus elements are copied. - Length fixed at compile time - Passed by value - Comparable (==) - Can be used as map key - Useful as "pseudo" constants Arrays example: ```go var a [3]int var b [3]int{0, 0, 0} var c [...]{0, 0, 0} // sized by initializer var d [3]int d = b // elements copied var m [...]int{1, 2, 3, 4} c = m // TYPE MISMATCH ``` ### Slice Slices are passed by reference; no copying, updating OK. - Variable length - Passed by reference - Not comparable - Cannot be used as map key - Has copy & append helpers - Useful as function parameters Slices example: ```go var a []int // nil, no storage var b = []int{1, 2} // initialized a = append(a, 1) // append to nil OK b = append(b, 3) // []int{1, 2, 3} a = b // overwrites a d := make([]int, 5) // []int{0, 0, 0, 0, 0} e := a // same storage (alias) e[0] == b[0] // true ``` ### Map Maps are dictionaries: indexed by key, returning a value, You can read from a nil map, but inserting will panic. Maps are passed by reference; no copying, updating OK. The type used for the key must have == and != defined (not slices, maps, or funcs). Maps example: ```go // This descriptor doesn't reference any actual hash table var m map[string]int // nil, no storage // What make does is to simply create that hash table in the background p := make(map[string]int) // non-nil but empty // Zero is the default of an int type a := p["the"] // returns 0 b := m["the"] // same thing // You CAN'T write key into the nil map m["and"] = 1 // PANIC - nil map // Copy the descriptor in p to m so that we can insert key and value to m m = p m["and"]++ // OK, same map as p now c := p["and"] // returns 1 ``` Maps can't be compared to one another; maps can be compared only to nil as a special case. ```go var m = map[string]int{ "and": 1, "the": 1, "or": 2, } var n map[string]int b := m == n // SYNTAX ERROR c := n == nil // true d := len(m) // 3 e := cap(m) // TYPE MISMATCH, cap is ask for the capacity in slice ``` Maps have a special two-result lookup function. The second variable tells you if the key was there. ```go // literal map p := map[string][int] // non-nil but empty // look up for "the", got 0, but we don't if it is empty map or not a := p["the"] // returns 0 // we can use below to find if it is empty map b, ok := p["and"] // 0, false p["the"]++ c, ok := p["the"] // 1, true // conditional statement: // declare variables w and ok by indexing p with a string "the" // the very next piece is the actual if condition if w, ok := p["the"]; ok { // we know w is not the default value ... } ``` ## Built-ins Each type has certain built-in functions. ``` len(s) string string length len(a), cap(a) array array length, capacity(constant) make(T, x) slice slice of type T with length x and capacity x make(T, x, y) slice slice of type T with length x and capacity y copy(c, d) slice copy from d to c; # = min of the two lengths c=append(c, d) slice append d to c and return a new slice result len(s), cap(s) slice slice length and capacity make(T) map map of type T make(T, x) map map of type T with space hint for x elements delete(m, k) map delete key k (if present, else no change) len(m) map map length ``` ## Make nil useful Nil is a type of zero: it indicates the absence of something. Many built-ins are safe: len, cap, range ```go var s []int var m map[string]int l := len(s) // length of nil size is 0 i, ok := m["int"] // 0, false for any missing key // skip if s is nil or empty for _, v := range s { ... } ``` --- Prev: [Go - 02 - Basic Types](https://hackmd.io/fQlaEGGlThG-53EOpZAL7g) Next: [Go - 04 - Control Statement; Declarations & Types]()