Seiring bertambahnya import, dua masalah kecil mulai mengganggu: dua package berbeda yang kebetulan bernama sama, dan import yang memanjang dari puluhan baris. Go menyediakan mekanisme alias untuk keduanya — cukup menuliskan nama pengganti sebelum import path. Pada chapter ini kita akan memakai alias untuk menyelesaikan bentrok nama package sungguhan, menyusun import dalam kelompok yang rapi, lalu menimbang dua bentuk import khusus: dot import yang memikat namun berbahaya, dan blank import yang sudah kita pakai pada chapter inisialisasi.
Kapan Alias Dibutuhkan #
Alias ditulis di depan import path, seperti pjk "contoh.com/laci/pajak". Tiga situasi yang paling sering membutuhkannya:
- Bentrok nama package: dua package berbeda memiliki nama package sama — misalnya
pajakdanongkiryang keduanya bernama packagehitung. - Nama terlalu generik: package seperti
util,types, ataucommontidak menjelaskan apa pun dari sisi pemanggil. - Nama terlalu panjang: package seperti
randomjsongeneratormelelahkan disebut berulang kali.
Tanpa alias, compiler menolak dua import yang menghasilkan nama package sama dalam satu berkas; alias menjadi jalan keluar satu-satunya untuk kasus bentrok.
Demo: Dua Package Bernama hitung #
Bundle chapter ini memuat dua package yang sama-sama bernama hitung — satu menghitung pajak, satu menghitung ongkir:
package hitung
// PPN adalah tarif pajak pertambahan nilai.
const PPN = 0.11
// Pajak menghitung pajak atas nilai dasar.
func Pajak(dasar int) int {
return int(float64(dasar) * PPN)
}package hitung
// Standar adalah tarif ongkir standar per kilogram.
const Standar = 15000
// Ongkir menghitung ongkir berdasarkan berat dalam kilogram.
func Ongkir(kg int) int {
return kg * Standar
}Program utama mengimpor keduanya sekaligus dengan alias berbeda:
package main
import (
"fmt"
ong "contoh.com/laci/ongkir"
pjk "contoh.com/laci/pajak"
)
func main() {
dasar := 250000
berat := 3
fmt.Println("dasar :", dasar)
fmt.Println("pajak :", pjk.Pajak(dasar))
fmt.Println("ongkir :", ong.Ongkir(berat))
}Jalankan dari dalam direktori src/:
cd src && go run .Output yang Dihasilkan:
dasar : 250000
pajak : 27500
ongkir : 45000Mari kita telaah baris demi baris berkas utama:
- Baris 3-8 (blok
import): satu kelompok untukfmt, satu kelompok terpisah untuk import lokal — pemisahan kosong satu baris membagi kedua kelompok. - Baris 6 (
ong "contoh.com/laci/ongkir"): aliasongmengikat packagehitungmilik direktoriongkir; tanpa alias,hitungbentrok dengan import berikutnya. - Baris 7 (
pjk "contoh.com/laci/pajak"): aliaspjkmelakukan hal yang sama untuk packagehitungmilik direktoripajak. - Baris 14-15: pemanggil
pjk.Pajakdanong.Ongkirterbaca jelas beda domainnya — justru lebih jelas daripada dua-duanya bernamahitung.Pajakdanhitung.Ongkir.
Mengelompokkan Import Tiga Blok #
Konvensi komunitas yang paling umum membagi import menjadi tiga kelompok berurutan: standard library, pihak ketiga, lalu module sendiri. Berikut bentuk lengkapnya pada proyek yang memakai dependency eksternal:
import (
"fmt"
"strings"
"github.com/google/uuid"
"contoh.com/apl/penyapa"
"contoh.com/apl/teks"
)Kelompok tidak punya makna bagi compiler — gofmt hanya menjaga urutan alfabetis di dalam setiap kelompok dan satu baris kosong antar kelompok. Nilainya murni keterbacaan: pembaca langsung tahu mana API bawaan bahasa, mana kode orang lain yang perlu di-update, dan mana kode tim sendiri. Tool goimports bahkan dapat menyusun kelompok ini otomatis sambil menambahkan import yang belum ada dan membuang yang tak terpakai — cukup jalankan goimports -w . pada direktori proyek.
Dot Import: Tanpa Prefiks, Tanpa Rasa Aman #
Bentuk paling ekstrem dari alias adalah dot import: import . "fmt" menaruh seluruh identifier package ke ruang nama berkas saat ini. Program berikut dijalankan nyata di direktori sementara:
package main
import . "fmt"
func main() {
Println("Halo tanpa prefiks fmt")
Printf("angka: %d\n", 42)
}Output yang Dihasilkan:
Halo tanpa prefiks fmt
angka: 42Fungsi Println dan Printf terpanggil tanpa prefiks — dan di situlah letak masalahnya. Pembaca tidak lagi bisa membedakan fungsi lokal, fungsi package lain, dan fungsi hasil dot import; tabrakan nama antara dua dot import tidak bisa diselesaikan; dan refactor memindahkan fungsi antar package menjadi petualangan. Karena itu dot import nyaris hanya muncul pada kode uji singkat dan presentasi.
Sebaliknya, blank import import _ "path" justru pola yang sehat untuk kebutuhan tertentu: package tetap diinisialisasi (variabel dan init() berjalan) tanpa mengikat namanya, persis seperti demo registrasi driver pada chapter Package Initialization
.
Alias menuntaskan urusan nama dalam satu module. Bagaimana jika kita mengembangkan beberapa module sekaligus — library dan aplikasi dalam satu folder kerja — tanpa saling menimpa? go.work menyediakan mekanisme workspace untuk itu, yang kita bahas pada chapter go.work
.
Referensi #
- Spesifikasi Go: Import declarations — sintaks resmi import dan alias.
- goimports — tool resmi pengatur import otomatis.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
src/main.go
Unduh berkaspackage main
import (
"fmt"
ong "contoh.com/laci/ongkir"
pjk "contoh.com/laci/pajak"
)
func main() {
dasar := 250000
berat := 3
fmt.Println("dasar :", dasar)
fmt.Println("pajak :", pjk.Pajak(dasar))
fmt.Println("ongkir :", ong.Ongkir(berat))
}
src/ongkir/hitung.go
Unduh berkaspackage hitung
// Standar adalah tarif ongkir standar per kilogram.
const Standar = 15000
// Ongkir menghitung ongkir berdasarkan berat dalam kilogram.
func Ongkir(kg int) int {
return kg * Standar
}
src/pajak/hitung.go
Unduh berkaspackage hitung
// PPN adalah tarif pajak pertambahan nilai.
const PPN = 0.11
// Pajak menghitung pajak atas nilai dasar.
func Pajak(dasar int) int {
return int(float64(dasar) * PPN)
}