Di artikel ini kita memperlihatkan contoh di mana interface pada Go mempermudah melakukan perubahan (refactor) pada kode yang telah ada untuk membuatnya lebih fleksibel dan ekstensibel. Awalnya, pustaka standar paket RPC menggunakan format kostum bernama gob. Untuk beberapa aplikasi, kita ingin menggunakan JSON sebagai format alternatif.

Pertama kita mendefinisikan pasangan interface untuk menjelaskan fungsionalitas dari format yang sudah ada, satu untuk sisi klien, satu lagi di sisi peladen (server).

type ServerCodec interface {
	ReadRequestHeader(*Request) error
	ReadRequestBody(interface{}) error
	WriteResponse(*Response, interface{}) error
	Close() error
}

Di sisi peladen, kita mengubah dua fungsi internal untuk menerima interface ServerCodec, mengganti gob.Encoder. Berikut salah satu dari fungsi tersebut,

func sendResponse(sending *sync.Mutex, req *Request,
	reply interface{}, enc *gob.Encoder, errmsg string)

menjadi

func sendResponse(sending *sync.Mutex, req *Request,
	reply interface{}, enc ServerCodec, errmsg string)

Kita kemudian menulis pembungkus untuk gobServerCodec untuk mereproduksi fungsionalitas yang asli. Setelah itu menjadi mudah untuk membuat jsonServerCodec.

Setelah melakukan perubahan yang sama di sisi klien, semua pekerjaan yang harus dilakukan telah selesai untuk paket RPC. Semua ini membutuhkan tidak lebih dari 20 menit! Setelah dirapikan sedikit dan melakukan pengujian pada kode yang baru, perubahan terakhir dikirim.

Pada bahasa beroritentasi objek-turunan seperti Java atau C++, langkah yang dilakukan untuk menyelesaikan masalah yang sama seperti di atas yaitu dengan menggeneralisasi class RPC, dan membuat sub-class untuk JsonRPC dan GobRPC. Namun, pendekatan dengan cara ini menjadi sedikit sulit jika kita ingin supaya perubahan tersebut ortogonal terhadap hirarki class. (Misalnya, jika kita memiliki implementasi standar RPC tersendiri). Dalam paket Go, kita mengambil langkah yang tidak hanya simpel secara konseptual namun juga memiliki perubahan kode yang sedikit dan jelas.

Kualitas vital dari setiap basis kode adalah pemeliharaan. Saat kebutuhan berubah, sangatlah penting supaya kode beradaptasi dengan mudah dan bersih, dan tidak menjadi liar dan susah untuk dikerjakan. Kami percaya bahwa sistem tipe berorientasi komposisi yang ringan pada Go membuat penstrukturan kode yang mudah dikembangkan.