> For the complete documentation index, see [llms.txt](https://davidwinalda94.gitbook.io/mastering-golang/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://davidwinalda94.gitbook.io/mastering-golang/interface-kosong.md).

# Interface Kosong

Pada sesi ini akan dibahas perbedaan antara Interface yang memiliki method dan Interface kosong

Interface kosong atau *empty interface* yang dinotasikan dengan `interface{}` merupakan tipe data yang bisa menampung segala jenis data seperti integer, string, boolean, bahkan array dan pointer, apapun. Untuk mendefenisikan Interface kosong, kita perlu mendeklarasikan tipe datanya yaitu `interface` yang ditambahkan `{}` sehingga menjadi `interface{}` .

Perbedaan dengan Interface sebelumnya adalah Interface kosong tidak memiliki method.

```go
package main

import "fmt"

func main() {
	var random interface{}

	random = 25
	fmt.Println(random)

	random = "Golang"
	fmt.Println(random)

	random = []string{"Wisma", "Yudis", "Guntur", "Sukisno"}
	fmt.Println(random)
}
```

Pada kode di atas kita membuat variabel bernama `random` dengan tipe data `interface` . Lalu kita meng-assign beberapa nilai dengan tipe data yang berbeda-beda ke dalam variabel `random` .

![Menampilkan nilai dari variabel random](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MScbRzyeBlx3bsnbkKc%2F-MSckrVMJyEOwS8aSgmC%2FScreen%20Shot%202021-02-03%20at%2023.39.24.png?alt=media\&token=03b216d9-14cb-49ff-88f6-806b985f92c7)

Kita lihat contoh tipe data `map` yang memiliki `key` dengan tipe data `string` dan `value` dengan tipe data apapun.

```go
package main

import "fmt"

func main() {
	var random map[string]interface{}

	random = map[string]interface{}{
		"name":     "David Winalda",
		"age":      26,
		"language": []string{"golang", "scala", "rush"},
	}
	fmt.Println(random)
}
```

![Menampilkan isi dari variabel random](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MScbRzyeBlx3bsnbkKc%2F-MScmT2OF5F9kGkAQIFq%2FScreen%20Shot%202021-02-03%20at%2023.46.20.png?alt=media\&token=c9ceff23-09e3-434e-a690-18914a6b94ec)

### Casting Variabel Interface Kosong <a href="#a282-casting-variabel-interface-kosong" id="a282-casting-variabel-interface-kosong"></a>

Kita akan melihat tipe data yang ada pada variabel dengan tipe `interface` yang telah kita assign dengan beberapa nilai dari tipe data yang berbeda.

```go
package main

import "fmt"

func main() {
	var random interface{}

	random = 25
	fmt.Printf("Value: %v, Data Type: %T\n", random, random)

	random = "Golang"
	fmt.Printf("Value: %v, Data Type: %T\n", random, random)

	random = []string{"Wisma", "Yudis", "Guntur", "Sukisno"}
	fmt.Printf("Value: %v, Data Type: %T\n", random, random)
}
```

![Menampilkan tipe data dari variabel random](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MScbRzyeBlx3bsnbkKc%2F-MScntgs3k767tdMSjTX%2FScreen%20Shot%202021-02-03%20at%2023.51.48.png?alt=media\&token=bebacc0e-4ef4-4dce-ae49-8be3fae94487)

Kita bisa melihat bahwa tipe data sudah sesuai dengan nilai yang kita masukkan ke dalam variabel.

Kita akan melakukan operasi dari nilai variabel yang didefinisikan sebagai interface.

```go
package main

import "fmt"

func main() {
	var a interface{}
	var b int = 10

	a = 25
	fmt.Printf("Value: %v, Data Type: %T\n", a, a)

	sum := a + b
	fmt.Println(sum)
}
```

![Error saat melakukan operasi pada variabel bertipe interface](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MScbRzyeBlx3bsnbkKc%2F-MScofFlpB7tBhwRCHDy%2FScreen%20Shot%202021-02-03%20at%2023.55.13.png?alt=media\&token=520c2578-55ba-4f1c-a3ac-ccace168c228)

Kita lihat bahwa output program menampilkan error saat melakukan operasi penambahan dari dua variabel yaitu `a` dengan tipe `interface` dan `b` dengan tipe `int` .

Untuk dapat melakukan operasi di atas kita perlu melakukan casting atau convert ke tipe data aslinya. Ini juga biasa disebut dengan Type Assertion.

```go
package main

import "fmt"

func main() {
	var a interface{}
	var b int = 10

	a = 25
	
	// casting variabel a ke tipe aslinya yaitu int
	sum := a.(int) + b
	fmt.Println(sum)
}
```

![Menampilkan hasil penambahan dari variabel a dan b](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MScbRzyeBlx3bsnbkKc%2F-MScpeT5AmaUTGg2oO8W%2FScreen%20Shot%202021-02-04%20at%2000.00.22.png?alt=media\&token=33333ef6-72d6-45f3-a968-f3ca83ee9ab6)

### Penerapan slice dengan Interface

Dengan Interface kita dapat memiliki data `struct` yang berisi nilai dengan tipe data apapun.

```go
package main

import "fmt"

func main() {
	var data = []interface{}{"David Winalda", 26, true}
	fmt.Println(data)
}
```

![Menampilkan isi variabel data dengan tipe struct](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MScplilHW5l9Nlp3vRs%2F-MScr00pn_N8WMb2FhRN%2FScreen%20Shot%202021-02-04%20at%2000.06.18.png?alt=media\&token=bd34b3f1-6dc9-447f-bc51-0367f830267a)
