# Array dan Slice

Di jurnal ini akan membahas tentang data struktur **array**. Dimana pembahasannya mencakup beberapa karakteristik dasar (fundamental) dan bagaimana implementasinya ketika menggunakannya di program.

## Pembukaan

Array adalah koleksi dari elemen yang mempunyai kapasitas yang nilainya ditentukan di awal pembuatannya, dimana di golang ukurannya adalah tetap (`fixed-size`), sehingga tidak bisa diperbesar atau ditambah kapasitasnya. Selain itu tipe data elemennya juga tetap atau sama.

Untuk setiap elemen dari array memiliki `index` berupa angka yang menggambarkan posisi urutan dari elemen di arraynya, index ini bisa digunakan untuk mengakses elemennya. Index array ini dimulai dari `0` . Secara default value dari `empty array` adalah zero values (seperti: `0`, `0.0`, `false`, atau `""`).

Slice mirip seperti array tapi memiliki ukuran atau panjangnya dinamis (ukuran bisa berubah atau tidak `fixed`). Slice menerapkan sistem referensi dari array. Sehingga perubahan slice bisa mengakibatkan slice lainnya berubah jika mempunyai alamat (`address`) yang sama.

Untuk mengetahui ukuran atau panjang array maupun slice dapat menggunakan function `len(varYangDiCek)`

## Sandbox

Array dibuat dengan `[panjangArray]TypeData`

```go
// deklarasi array dengan panjang 5 yang elemennya bertype data int
var nomorFavorit [5]int
nomorFavorit[0] = 10

// nomorFavorit sekarang menjadi [10 0 0 0 0]
// 0 adalah zero value dari int

// jika deklarasi langsung initialisasi dapat ditulis
initialTeman := [5]string{"A", "C", "R", "D", "B"}

// untuk mendapatkan elemen dapat melakuakan indexing
nomorPertama := nomorFavorit[0] // print: 10
```

{% hint style="info" %}
Element array dapat berupa tipe data apapun bahkan array. misal untuk kasus nested array (array multidimensi). Berikut contoh beberapa cara penulisannya

```go
var myNumbersVersi1 = [2][3]int{[int]{32, 21, 10}, [3]int{9, 8, 6}}
var myNumbersVersi2 = [2][3]int{{32, 21, 10}, {9, 8, 6}}
```
{% endhint %}

jika penulisan secara vertical wajib menambahkan tanda koma di akhir

```go
initialTeman := [5]string{
    "A",
    "C",
    "R",
    "D",
    "B",  // <------
}
```

Untuk deklarasi tanpa mengetahui panjang array dapat mengguakan ellipses operator (`...`) di dalam panjang arraynya

```go
var myBestYears = [...]int{2013, 2020, 2021, 2015, 2018}

fmt.PrintLn(len(myBestYears)) // 5
```

dengan hal tersebut maka panjang array akan menyesuaikan data yang di initialisasi.

{% hint style="success" %}
**Jika tidak** menuliskan ukuran array dan tidak memakai `...` operator maka yang terbuat adalah **slice** (disebut slice literal)**.** Contoh:

```go
var mySlice []int
```
{% endhint %}

Secara default code `var mySlice []int` akan menghasilkan panjang 0. Jika mau membuat slice bisa mengguakan function `make()` sehingga bisa membuat ukuran secara dinamis.

```go
// membuat slice dengan panjang 5 dan 
nums := make([]int, 5, 10) // len(nums) == 5, cap(nums) == 10
```

Tiga hal yang ada di slice dari make:

* type `->` type data element yang akan dibuat ke slice
* length `->` panjang element yang di set ke slice
* capacity \<optional> `->` maks size yang di set

## Implementasi

### Iterasi array ataupun slice

### membuat slice dari array

### Function di slice

## Latihan

> TODO add repl.it link dari soal latihan golang array dan slice
