Collection
Array
An array in Go is a fixed sized entity. All elements in an array must have same type.
// long way
var arr [3]int
arr[0] = 1
arr[1] = 2
arr[2] = 3
// short way
arr := [3]int{1, 2, 3}
> [1 2 3]
Slice
Slice is built on top of array. It is like array, but dynamically sized and offer up a lot of really neat attributes used more than array
Therefore, you can create slice from array by using [start:end].
arr := [3]int{1, 2, 3}
slice := arr[:] // [:] means from start to end
Slice is kind of pointer, not really, but it is pointing to underlying array. Change arr will change slice as well.
arr[1] = 42
slice[2] = 27
> arr: [1 42 27]
> slice: [1 42 27]
Otherwise, create a new slice:
slice := []int{1, 2, 3}
Using append(slice, elements...) to add new elements to slice.
slice = append(slice, 4, 5, 6)
> slice: [1 2 3 4 5 6]
Just like create slice from array, we can also create sub slices from slice using [start:end]
s2 := slice[1:]
s3 := slice[:2]
s4 := slice[1:2]
> s2: [2 3 4 5 6]
> s3: [1 2]
> s4: [2]
Map
Map represents key-value relationship. To create map, use map keyword.
m := map[string]int{ "foo" : 42 }
> m: map[foo:42]
> m["foo"]: 42
All the keys had to be the same type, same with all the values.
m["foo"] = 27
m["foo"] = "bar" // error: (type string) cannot be represented by the type int
You can delete a pair using delete(map, key).
delete(m, "foo")
> m: map[]
Struct
Go doesn't have class, but it has struct.
This is the only collection type that allows associate disparate data types together.
In struct, field is fixed at compile time. To declare a struct:
type user struct {
  ID        int
  FirstName string
  LastName  string
}
To add the value to field:
var u user
> u: {0  } // struct initialized with 0 value (0 in int is 0, 0 in string in blank)
u.ID = 1
u.FirstName = "Huy"
u.LastName = "Tu"
> u: {1 Huy Tu}
Note that the fields are fixed at compile time, means it cannot be dynamically added or removed.
There's also an implicit way to declare struct:
u := user{ID: 1, FirstName: "Huy", LastName: "Tu"}
> u: {1 Huy Tu}
If you use multiple lines declaration, you will need to add a comma at the end.
Below declaration will get error:
u := user{ ID: 1,
  FirstName: "Huy",
  LastName: "Tu" // error: Need a trailing comma before a newline in the composite literal
}