creating a slice

// initialized
mySlice := []type{val1, val2, ..., valN}

slicing syntax

slice[start:end] // slices from [start, end)
// omiting start means "start at 0", omiting end means "go all the way to the end"

extending arrays with slices

mySlice := []int{1, 2, 3}
mySlice = append(mySlice, 1, 3, 4)
 
// mySlice = [1, 2, 3, 1, 3, 4]
 
or
 
slice1 := []int{1, 2, 3}
slice2 := []int{4, 5, 6}
combined = append(slice1, slice2...)
 
// combined = [1, 2, 3, 4, 5, 6]

preallocation

slice := make([]type, size) 
// slice will have length size and default values for type

multidimensional slices

board := [][]string{
	[]string{"_", "_", "_"}, // <- this line uses type declaration
	{"_", "_", "_"}, // <- these last two do not
	{"_", "_", "_"}, // type declaration here is optional
}