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
danGetTitle
adalah exported.quantity
,person
, dangetQuantity
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)
}
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)
}
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
, atauprotected
seperti di bahasa lain.
Dengan memahami aturan ini, Anda dapat mengontrol aksesibilitas kode Anda di Go dengan mudah dan efektif.