Skip to main content

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 \leftarrow 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}
warning

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
}