Type Assertion dan Interface Part [2]

Iman Tumorang
GolangID
Published in
3 min readSep 8, 2017

Menelusuri type assertion dan optimizing penggunaan interface di golang

Image from searching in google Images

Sebelumnya saya sudah post tentang Type Assertion dan Interface di golang

Ini merupakan seri kedua dari post tetang type assertion dan interface di golang.

Sebelumnya :

  • Penggunaan Interface pada golang

Type casting

Golang sangat strict dengan tipe data. Jika kamu memiliki dua variabel denga berbeda tipe data, misal int dan int64 kamu tidak bisa langsung melakukan assign

Contoh :

var a int
var b int64
a = 100
b = a //ini dilarang, dapat menyebabkan error saat mengompile

Untuk mengatasi ini, di golang, kita dapat melakukan type casting atau mengubah tipe data. Type casting hanya dapat di lakukan untuk tipe atau struct yang memiliki kemiripan.

Contoh type casting pada numerik

var (
a int
b int64
c float64
d float32
)
a = 100
b = int64(a)
c = float64(b)
d = float32(c)

Type casting juga bisa di lakukan pada struct . Namun yang hanya berlaku untuk struct yang identik tetapi berbeda package atau berbeda nama

Contoh:

type A struct {
fieldSatu int
fieldDua string
}
type B struct {
fieldSatu int
fieldDua string
}
a:= A {fieldSatu: 10 , fieldDua : "Hello World"}
b = B(a) // lakukan casting pada struct a

Code di atas akan mengubah tipe data object a dari struct Amenjadi tipe struct B .

Atau contoh untuk berbeda package

Package kendaraan

package kendaraantype Mobil struct {
Nama string
Seri string
Tahun int
}

Package avanza

package avanzatype Avanza struct {
Nama string
Seri string
Tahun int
}

Package main

package main
import (
"kendaraan"
"avanza"
func main () {
m:=kendaraan.Mobil{ Nama : "Avanza" , Seri:"3xdFd" , Tahun: "2017"}
av:=avanza.Avanza(m) // casting langsung tipe datanya
}

Demikian untuk casting tipe data pada golang.

Type Assertion

Di golang kita juga mengenal apa yang di sebut dengan type assertion. Type assertion sifatnya adalah dengan casting interface

Pada golang, object interface dapat di sisipi oleh segala jenis tipe data.

var terima_apa_aja interface{}terima_apa_aja = 12terima_apa_aja = "12"terima_apa_aja = int64(12)terima_apa_aja = &SebuahStruct{FieldSatu:12}terima_apa_aja = map[int]string{}

Saat sebuah value di masukkan ke dalam interface{} maka tipe datanya berubah menjadi interface{} juga. Lalu ? Bagaimana untuk mengembalikan ke tipe data awal ?

var inter interface{}
var stringData string = "Hello World"
inter = stringDatavar temporaryData string temporaryData = inter // ini dilarang dan menyebabkan error

Nah untuk mengatasi masalah ini, maka hal yang dapat di lakukan adalah tipe assertion

var inter interface{}
var stringData string = "Hello World"
inter = stringDatavar temporaryData stringtemporaryData = inter.(string) //lakukan type assertion //ATAUtemporaryData,ok:=inter.(string) ; !ok{
fmt.Println("Fail to assert. Tidak Sejenis")
}

Type Switch

Dengan interface, tersebut di atas, kita juga dapat melakukan type switch

Contoh :

var inter interface{}inter = 12switch inter.(type) {
case int :
fmt.Println("Tipe datanya integer")
case string :
fmt.Println("Tipe datanya String")
default :
fmt.Println("Unknow tipe data")
}

Codeblock di atas akan mencetak : Tipe datanya integer

Kesimpulan :
Sejauh ini kita telah mempelajari :

  • Type assertion
  • Type Casting

Kedua topik di atas adalah topik hal mendasar. Namun orang sering lupa dan gagal di topik ini

If you have a question , or need more explanation, or something, that I can not explain well here, you can ask me from my linkedin or email me. Thank you

--

--

Iman Tumorang
GolangID

Software Architect @ Xendit | Independent Software Architect @ SoftwareArchitect.ID | Reach me at https://imantumorang.com for fast response :)