24. Method

Method adalah fungsi yang menempel pada struct, sehingga hanya bisa di akses lewat variabel objek.

Keunggulan method dibanding fungsi biasa adalah memiliki akses ke property struct hingga level private (level akses nantinya akan dibahas lebih detail pada bab selanjutnya). Dan juga, dengan menggunakan method sebuah proses bisa di-enkapsulasi dengan baik.

24.1. Penerapan Method

Cara menerapkan method sedikit berbeda dibanding penggunaan fungsi. Ketika deklarasi, ditentukan juga siapa pemilik method tersebut. Contohnya bisa dilihat pada kode berikut:

package main

import "fmt"
import "strings"

type student struct {
    name  string
    grade int
}

func (s student) sayHello() {
    fmt.Println("halo", s.name)
}

func (s student) getNameAt(i int) string {
    return strings.Split(s.name, " ")[i-1]
}

Cara deklarasi method sama seperti fungsi, hanya saja perlu ditambahkan deklarasi variabel objek di sela-sela keyword func dan nama fungsi. Struct yang digunakan akan menjadi pemilik method.

func (s student) sayHello() maksudnya adalah fungsi sayHello dideklarasikan sebagai method milik struct student. Pada contoh di atas struct student memiliki dua buah method, yaitu sayHello() dan getNameAt().

Contoh pemanfaatan method bisa dilihat pada kode berikut.

func main() {
    var s1 = student{"john wick", 21}
    s1.sayHello()

    var name = s1.getNameAt(2)
    fmt.Println("nama panggilan :", name)
}

Output:

Penggunaan method

Cara mengakses method sama seperti pengaksesan properti berupa variabel. Tinggal panggil saja methodnya.

s1.sayHello()
var name = s1.getNameAt(2)

Method memiliki sifat yang sama persis dengan fungsi biasa. Seperti bisa berparameter, memiliki nilai balik, dan lainnya. Dari segi sintaks, pembedanya hanya ketika pengaksesan dan deklarasi. Bisa dilihat di kode berikut, sekilas perbandingan penulisan fungsi dan method.

func sayHello() {
func (s student) sayHello() {

func getNameAt(i int) string {
func (s student) getNameAt(i int) string {

24.2. Method Pointer

Method pointer adalah method yang variabel objek pemilik method tersebut berupa pointer.

Kelebihan method jenis ini adalah, ketika kita melakukan manipulasi nilai pada property lain yang masih satu struct, nilai pada property tersebut akan di rubah pada reference nya. Lebih jelasnya perhatikan kode berikut.

package main

import "fmt"

type student struct {
    name  string
    grade int
}

func (s student) changeName1(name string) {
    fmt.Println("---> on changeName1, name changed to", name)
    s.name = name
}

func (s *student) changeName2(name string) {
    fmt.Println("---> on changeName2, name changed to", name)
    s.name = name
}

func main() {
    var s1 = student{"john wick", 21}
    fmt.Println("s1 before", s1.name)
    // john wick

    s1.changeName1("jason bourne")
    fmt.Println("s1 after changeName1", s1.name)
    // john wick

    s1.changeName2("ethan hunt")
    fmt.Println("s1 after changeName2", s1.name)
    // ethan hunt
}

Output:

Penggunaan method pointer

Setelah eksekusi statement s1.changeName1("jason bourne"), nilai s1.name tidak berubah. Sebenarnya nilainya berubah tapi hanya dalam method changeName1() saja, nilai pada reference di objek-nya tidak berubah. Karena itulah ketika objek di print value dari s1.name tidak berubah.

Keistimewaan lain method pointer adalah, method itu sendiri bisa dipanggil dari objek pointer maupun objek biasa.

// pengaksesan method dari variabel objek biasa
var s1 = student{"john wick", 21}
s1.sayHello()

// pengaksesan method dari variabel objek pointer
var s2 = &student{"ethan hunt", 22}
s2.sayHello()

Berikut adalah penjelasan tambahan mengenai beberapa hal pada bab ini.

24.3. Penggunaan Fungsi strings.Split()

Di bab ini ada fungsi baru yang kita gunakan: strings.Split(). Fungsi ini berguna untuk memisah string menggunakan pemisah yang ditentukan sendiri. Hasilnya adalah array berisikan kumpulan substring.

strings.Split("ethan hunt", " ")
// ["ethan", "hunt"]

Pada contoh di atas, string "ethan hunt" dipisah menggunakan separator spasi " ". Maka hasilnya terbentuk array berisikan 2 data, "ethan" dan "hunt".

24.4. Apakah fmt.Println() & strings.Split() Juga Merupakan Method ?

Setelah tahu apa itu method dan bagaimana penggunaannya, mungkin akan muncul di benak kita bahwa kode seperti fmt.Println(), strings.Split() dan lainnya-yang-berada-pada-package-lain juga merupakan method.

Tapi sayangnya bukan. fmt disitu bukanlah variabel objek, dan Println() bukan merupakan method-nya.

fmt adalah nama package yang di-import (bisa dilihat pada kode import "fmt"). Sedangkan Println() adalah nama fungsi. Untuk mengakses fungsi yang berada pada package lain, harus dituliskan nama package-nya. Hal ini berlaku juga di dalam package main. Jika ada fungsi dalam package main yang diakses dari package lain yang berbeda, maka penulisannya main.NamaFungsi().

Lebih detailnya akan dibahas di bab selanjutnya.

results matching ""

    No results matching ""