Di Go, tidak ada istilah “Public”, “Protected”, dan “Private” seperti pada bahasa pemrograman lain (misal PHP atau Java) untuk mengatur hak akses pada properti atau metode. Go menggunakan konsep “Exported” dan “Unexported” untuk mengatur visibilitas antar package.

Secara sederhana:

  • Exported: Identifier (nama variabel, fungsi, struct, dsb.) yang dapat diakses dari package lain.
  • Unexported: Identifier yang hanya dapat diakses dari dalam package yang sama.

Penentu utama visibilitas di Go adalah kapitalisasi huruf pertama pada nama identifier:

  • Huruf kapital di awal: Exported (bisa diakses dari package lain).
  • Huruf kecil di awal: Unexported (hanya bisa diakses dari package yang sama).

Contoh Penggunaan Visibilitas

Biasanya, aturan ini digunakan saat mendeklarasikan struct, field struct, atau metode. Jika nama struct, field, atau metode diawali huruf kapital, maka ia exported dan dapat digunakan oleh package lain. Sebaliknya, jika diawali huruf kecil, maka hanya bisa diakses di package yang sama.

Contoh dalam Satu File/Package

// entity.go
package main

type Book struct {
    Title    string // Exported field
    quantity int    // Unexported field
}

type person struct { // Unexported struct
    //
}

func (b *Book) GetTitle() string { // Exported method
    return b.Title
}

func (b *Book) getQuantity() int { // Unexported method
    return b.quantity
}

Pada kode di atas:

  • Book dan GetTitle adalah exported.
  • quantity, person, dan getQuantity adalah unexported.

Penggunaan dalam Satu Package

// main.go
package main

import "fmt"

func main() {
    book1 := &Book{
        Title:    "Book 1",
        quantity: 2,
    }

    fmt.Println("Book 1 :", book1)
    fmt.Println("Book 1 Name :", book1.GetTitle())
    fmt.Println("Book 1 Quantity :", book1.getQuantity())

    var person person
    fmt.Println("Person :", &person)
}

Image 1

Pada contoh di atas, semua identifier dapat diakses karena berada dalam package yang sama (main).


Contoh Antar Package

Jika kode dipisahkan ke dalam package berbeda, aturan visibilitas Go akan berlaku lebih ketat.

entity.go

// entity.go
package entity

type Book struct {
    Title    string // Exported
    quantity int    // Unexported
}

type person struct { // Unexported
    //
}

func (b *Book) GetTitle() string { // Exported
    return b.Title
}

func (b *Book) getQuantity() int { // Unexported
    return b.quantity
}

main.go

// main.go
package main

import (
    "fmt"
    "visibility/entity"
)

func main() {
    book1 := &entity.Book{
        Title:    "Book 1",
        quantity: 2, // Error: quantity is unexported
    }

    fmt.Println("Book 1 :", book1)
    fmt.Println("Book 1 Name :", book1.GetTitle())
    fmt.Println("Book 1 Quantity :", book1.getQuantity()) // Error: getQuantity is unexported

    var person entity.person // Error: person is unexported
    fmt.Println("Person :", &person)
}

Image 2

Jika dijalankan, akan muncul error seperti berikut:

# command-line-arguments
.\main.go:11:3: cannot refer to unexported field 'quantity' in struct literal of type entity.Book
.\main.go:16:40: book1.getQuantity undefined (cannot refer to unexported field or method getQuantity)
.\main.go:18:13: cannot refer to unexported name entity.person

Penjelasan error:

  • Tidak bisa mengakses field quantity karena unexported.
  • Tidak bisa memanggil method getQuantity karena unexported.
  • Tidak bisa menggunakan struct person karena unexported.

Kesimpulan

  • Di Go, visibilitas diatur dengan kapitalisasi nama identifier.
  • Identifier yang diawali huruf kapital (exported) dapat diakses dari package lain.
  • Identifier yang diawali huruf kecil (unexported) hanya dapat diakses dari package yang sama.
  • Tidak ada keyword public, private, atau protected seperti di bahasa lain.

Dengan memahami aturan ini, Anda dapat mengontrol aksesibilitas kode Anda di Go dengan mudah dan efektif.