Slices are arrays but without a fixed length (kind of, the array under it has a fixed length) Slices have a capacity and a length. Capacity is the fixed length of underlying array, which increases every time the slice's length above goes above array length. Old array gets dumped into new created array plus added value of slice to form a new slice. Slices and arrays are composite literals. Let's composite a group of values of the same type. Format: type{values}. Example: []int{1,2,3} Slice is a reference type meaning it will pass an address of its value instead of a copy. Slices hold pointers to an underlying array. x := [][] int {[] int { 1 }, [] int { 1 , 2 }} y := x fmt. Println ( "Before appending 3 to Y[0]:" ) fmt. Println ( "X: " , x) fmt. Println ( "Y: " , y) y[ 0 ] = append (y[ 0 ], 3 ) fmt. Println ( "After appending 3 to Y[0]:" ) fmt. Println ( "X: " , x) fmt. Println ( "Y: &q