Go interface dan error handling

wahyu eko hadi saputro
3 min readMay 7, 2021

Interface adalah sebuah layer dimana user / pengguna dapat berinteraksi. Misal sebuah handphone dimana ada tombol on off yang mana user dapat berinteraksi dengan tombol tersebut.

Berikut beberapa kegunaan interface :

  1. Menyembunyikan kompleksitas dari user, misal button on off pada handphone, jika handphone dalam keadaan mati ditekan tombol tersebut maka handphone akan menyala, dan jika dalam keadaan menyala ditekan tombol tersebut maka handphone akan mati. Di sini user dipermudah cukup tekan button on off maka handphone mati atau menyala sendiri.
  2. Separation / perbedaan layer yang jelas antara interface dan implementasi
  3. 1 interface bisa memiliki lebih dari 1 implementasi contoh button on off pada handphone, button tersebut memiliki fungsi menyalakan dan mematikan handphone.
  4. Penggunaan interface juga memudahkan dalam melakukan unit testing aplikasi, tinggal membuat mock implementation dari interface tersebut.

Di golang pembuatan interface dapat dilakukan dengan kode seperti berikut :

Type nama-interface interface {      Nama-method jika diperlukan}

Digolang ada istilah interface kosong (empty interface), interface kosong adalah interface yang tidak punya method didalamnya, contoh

Type animal interface {}.

Karena tidak memiliki method pada interface kosong, maka secara tidak langsung atau implisit interface kosong dapat menerima semua tipe data baik int, string, struct dll.

type testInterface interface{}

func main() {
var temp testInterface = 5
temp = “cumii”
fmt.Println(temp)
}

Pada contoh diatas testInterface adalah sebuah interface kosong, makanya var temp yang bertipe interface dapat menerima beberapa tipe data, pada contoh diatas testInterface diassign int kemudian diassign dengan string.

type Animal interface {
printName()
}

type Dog struct {
Name string
}

func (dog *Dog) printName() {
fmt.Println(“name = “ + dog.Name)
}

func main() {
var dogi Animal = &Dog{Name: “kintami”}
dogi.printName()
}

wahyu@wahyu-Lenovo-ThinkBook-14-IIL:~/Projects/test-project$ go run test.go
name = kintami

Pada contoh diatas kita menggunakan variabel dogi dengan tipe datanya Animal (interface) dan diassign dengan struct Dog pointer.

Interface error

Istilah error pada golang berbeda dengan istilah error pada pemprgraman yang lain misalnya java, pada golang istilah error adalah string yang dibalikan oleh sebuah fungsi. Bisa dibllang error pada golang adalah return / balikan data dari sebuah fungsi.

type Animal interface {
testError() (int, error)
}

type Dog struct {
Name string
}

func (dog *Dog) testError() (int, error) {
return 4, errors.New(“hello error anjing : “ + dog.Name)
}

func main() {
var dogi Animal = &Dog{Name: “kintami”}

var data int
var err error
data, err = dogi.testError()
fmt.Println(data)
if err != nil {
fmt.Println(err.Error())
}
}

wahyu@wahyu-Lenovo-ThinkBook-14-IIL:~/Projects/test-project$ go run test.go
4
hello error anjing : kintami

Pada kodingan func (dog *Dog) testError() (int, error) , error adalah sebuah interface

type error interface { Error() string}

error interface bawaan dari golang yang memiliki method Error()

errors.New(“hello error anjing : “ + dog.Name)

Kodingan ini pada implementasi detailnya adalah mendeklarasikan struct, berikut detailnya

package errors

// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {
return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
s string
}

func (e *errorString) Error() string {
return e.s
}

Saat method New dipanggil maka akan dideklarasikan struct errorString, kemudian jika method Error dipanggil maka akan dikembalikan variable s yang bertipe data string.

fmt.Println(err.Error())

Kodingan ini akan mengeprint string errornya yaitu hello error anjing : kintami.

Error Stack Trace

Kita sudah mempelajari error interface bawaan go, tapi error interface bawaan go tidak menyediakan fungsi untuk memunculkan stack trace oleh sebab itu diperlukan package tambahan dari go yang bisa diakses di link berikut https://github.com/pkg/errors.

Jalan go get github.com/pkg/errors berikut untuk mendownload packagenya. Berikut contoh kodingannya.

import (
“fmt”
//pcakage error
“github.com/pkg/errors”
)

type Animal interface {
testError() (int, error)
}

type Dog struct {
Name string
}

func (dog *Dog) testError() (int, error) {
oriErr := errors.New(“hello error anjing : “ + dog.Name)
oriErr = errors.Wrap(oriErr, “ ajaa “)
return 4, oriErr
}

func main() {
var dogi Animal = &Dog{Name: “kintami”}
var err error
_, err = dogi.testError()
//mengubah interface ke implementasi dari interface tersebut yaitu stuct Dog
ok := dogi.(*Dog)
fmt.Println(ok.Name)
if err != nil {
//untuk mendapatkan stack tracenya
fmt.Printf(“stack trace => %+v \n\n “, err)
//mendapatkan original error
cause := errors.Cause(err)
fmt.Println(cause)

}
}

wahyu@wahyu-Lenovo-ThinkBook-14-IIL:~/Projects/test-project$ go run test.go
kintami
stack trace => hello error anjing : kintami
main.(*Dog).testError
/home/wahyu/Projects/test-project/test.go:18
main.main
/home/wahyu/Projects/test-project/test.go:26
runtime.main
/usr/local/go/src/runtime/proc.go:204

Errornya sudah muncul stack tracenya.

referensi :

https://golangdocs.com/pointers-in-golang

--

--