Golang Method

Bahasa go tidak memiliki class, namun untuk pendekatan oop, digunakan method pada semua types (baik struc atau non-struct type).

Method pada golang adalah function dengan tambahan parameter receiver_argument type.

func(reciver_name Type) nama_method(parameter_list)(return_type){
  // Code goes here
}

Contohnya, kita buat struct rect untuk menyimpan data panjang dan lebar.

type rect struct {
    panjang, lebar int
}

Kemudian, kita buat method untuk menghitung luas persegi panjang dari struct rect. Disini kita gunakan pointer receiver.

func (r *rect) luas() int {
    return r.panjang * r.lebar
}

Selanjutnya kita hanya perlu mengisi data rect dan memanggil method luas().

r := rect{panjang: 5, lebar: 4}
fmt.Println("Luas persegi panjang: ", r.luas())

Tidak ada batasan jumlah method, kita bisa tambahkan method kedua untuk menghitung keliling. Disini kita gunakan value receiver.

func (r rect) keliling() int {
	return 2*r.panjang + 2*r.lebar
}
package main

import (
	"fmt"
)

type rect struct {
	panjang, lebar int
}

func (r *rect) luas() int {
	return r.panjang * r.lebar
}

func (r rect) keliling() int {
	return 2*r.panjang + 2*r.lebar
}

func main() {
	r := rect{panjang: 5, lebar: 4}
	fmt.Println("Luas persegi panjang: ", r.luas())
	fmt.Println("Keliling persegi panjang: ", r.keliling())
}
Luas persegi panjang:  20
Keliling persegi panjang:  18

Pointer dan Value Receiver

Receiver method luas() digunakan pointer, artinya kita bisa melakukan perubahan data pada rect struct dari dalam method. Hal ini tidak bisa dilakukan jika digunakan value.

Agar lebih jelas, berikut versi modifikasi code diatas, dimana pada method luas() ditambahkan baris code untuk mengubah data panjang.

func (r *rect) luas() int {
	r.panjang = 6
	return r.panjang * r.lebar
}
package main

import (
	"fmt"
)

type rect struct {
	panjang, lebar int
}

package main

import (
	"fmt"
)

type rect struct {
	panjang, lebar int
}

func (r *rect) luas() int {
	r.panjang = 6
	return r.panjang * r.lebar
}

func (r rect) keliling() int {
	return 2*r.panjang + 2*r.lebar
}

func main() {
	r := rect{panjang: 5, lebar: 4}
	fmt.Println("Luas persegi panjang: ", r.luas())
	fmt.Println("Keliling persegi panjang: ", r.keliling())
}


func (r rect) keliling() int {
	return 2*r.panjang + 2*r.lebar
}

func main() {
	r := rect{panjang: 5, lebar: 4}
	fmt.Println("Luas persegi panjang: ", r.luas())
	fmt.Println("Keliling persegi panjang: ", r.keliling())
}
Luas persegi panjang:  24
Keliling persegi panjang:  20

Dari result diatas, dapat dilihat perubahan data panjang pada method luas mengubah nilai pada rect struct.

Lalu ganti method luas dengan value receiver (tanda * dihapus).

func (r rect) luas() int {
	r.panjang = 6
	return r.panjang * r.lebar
}
import (
	"fmt"
)

type rect struct {
	panjang, lebar int
}

func (r rect) luas() int {
	r.panjang = 6
	return r.panjang * r.lebar
}

func (r rect) keliling() int {
	return 2*r.panjang + 2*r.lebar
}

func main() {
	r := rect{panjang: 5, lebar: 4}
	fmt.Println("Luas persegi panjang: ", r.luas())
	fmt.Println("Keliling persegi panjang: ", r.keliling())
}
Luas persegi panjang:  24
Keliling persegi panjang:  18

Perubahan data panjang menjadi 6, hanya pada method luas, namun tidak pada rect struct.

Terbukti dengan nilai keliling tetap 18, yaitu 2*5 + 2*4.

Jadi, jika Anda ingin data bisa diubah dari method, gunakan pointer, jika tidak gunakan value receiver.

Sharing is caring:

Leave a Comment