Interface
Interface merupakan suatu tipe data yang berisi kumpulan definisi method (hanya definisi saja) dengan nama tertentu. Untuk default value dari interface adalah nil. Interface syaratnya harus method dan method syaratnya harus ada kepemilikan. Contoh untuk 2 method Greeting code di bawah ini merupakan method milik struct Account dan Customer. Method tersebut dapat ditampung dalam sebuah interface bernama CustomerInterface.
Contoh code 1
package main
import "fmt"
type CustomerInterface interface {
Greeting() string
}
type Account struct {
Name string
Password string
}
type Customer struct {
Name string
AccountID int
}
func (a Account) Greeting() string {
return "Hi " + a.Name
}
func (c Customer) Greeting() string {
return "Welcome " + c.Name
}
// function untuk menggunakan interface dari method beberapa struct.
func NewUser(customerInterface CustomerInterface) string {
return customerInterface.Greeting()
}
func main() {
// variabel yang memiliki method yang sama dengan CustomerInterface
account1 := Account{
Name: "Dana",
Password: "Test123",
}
customer1 := Customer{
Name: "Firman",
AccountID: 1,
}
fmt.Println(NewUser(customer1))
fmt.Println(NewUser(account1))
}
Contoh code 2
Kegunaan Interface untuk membuat Mocking
Jika suatu fungsi dari suatu package membutuhkan input bertipe interface, kita dapat membuat mockingan dari method yang ada didalam fungsi tersebut.
Semisal ada go module bernama "go-rest-api" yang di dalamnya terdapat 2 file yaitu repository.go dan handler.go.
Di package lain semisal handler.go membutuhkan method CheckUserByName dan Create dari package repository. Package tersebut diinputkan melalui fungsi NewHandler dengan parameter repo bertipe interface.
Semisal ingin membuat unit test dari method Example di package handler yang memanggil method CheckUserByName dan Create. Kita perlu membuat mocking repository yang memiliki method mirip package repository menggunakan package testify/mock seperti dibawah ini.
Mocking-an di atas dapat dijadikan sebagai input di fungsi NewHandler di unit testing seperti code di bawah ini karena fungsi NewHandler menerima input repo dengan tipe interface Repositorier. Interface Repositorier memiliki 2 method yaitu CheckUserByName dan Create. Baik package repository atau repositorymock mempunyai fungsi NewRepository dan NewRepoMock yang mengembalikkan struct yang memiliki 2 method tersebut.
Referensi:
Last updated