Go mengadopsi dua jenis penulisan variabel, yaitu yang dituliskan tipe data-nya, dan juga yang tidak. Kedua cara tersebut valid dan tujuannya sama, pembedanya hanya cara penulisannya saja.
Pada bab ini akan dikupas tuntas tentang macam-macam cara deklarasi variabel.
Go memiliki aturan cukup ketat dalam hal penulisan variabel. Ketika deklarasi, tipe data yg digunakan harus dituliskan juga. Istilah lain dari konsep ini adalah manifest typing.
Berikut adalah contoh cara pembuatan variabel yang tipe datanya harus ditulis. Silakan tulis pada projek baru atau pada projek yang sudah ada, bebas. Pastikan saja untuk setipa projek baru untuk tidak lupa inisialisasi projek menggunakan command go mod init <nama-project>
. Ok lanjut.
package main
import "fmt"
func main() {
var firstName string = "john"
var lastName string
lastName = "wick"
fmt.Printf("halo %s %s!\n", firstName, lastName)
}
Keyword var
di atas digunakan untuk deklarasi variabel, contohnya bisa dilihat pada firstName
dan lastName
.
Nilai variabel firstName
diisi langsung ketika deklarasi, berbeda dibanding lastName
yang nilainya diisi setelah baris kode deklarasi, hal seperti ini diperbolehkan di Go.
Pada kode di atas bisa dilihat bagaimana sebuah variabel dideklarasikan dan diisi nilainya. Keyword var
digunakan untuk membuat variabel baru.
Skema penggunaan keyword var:
var <nama-variabel> <tipe-data>
var <nama-variabel> <tipe-data> = <nilai>
Contoh:
var lastName string
var firstName string = "john"
Nilai variabel bisa di-isi langsung pada saat deklarasi variabel.
Fungsi ini digunakan untuk menampilkan output dalam bentuk tertentu. Kegunaannya sama seperti fungsi fmt.Println()
, hanya saja struktur outputnya didefinisikan di awal.
Perhatikan bagian "halo %s %s!\n"
, karakter %s
disitu akan diganti dengan data string
yang berada di parameter ke-2, ke-3, dan seterusnya.
Contoh lain, ketiga baris kode berikut ini akan menghasilkan output yang sama, meskipun cara penulisannya berbeda.
fmt.Printf("halo john wick!\n")
fmt.Printf("halo %s %s!\n", firstName, lastName)
fmt.Println("halo", firstName, lastName + "!")
Tanda plus (+
) jika ditempatkan di antara string, fungsinya adalah untuk penggabungan string atau string concatenation.
Fungsi fmt.Printf()
tidak menghasilkan baris baru di akhir text, oleh karena itu digunakanlah literal newline yaitu \n
, untuk memunculkan baris baru di akhir. Hal ini sangat berbeda jika dibandingkan dengan fungsi fmt.Println()
yang secara otomatis menghasilkan new line (baris baru) di akhir.
Selain manifest typing, Go juga mengadopsi konsep type inference, yaitu metode deklarasi variabel yang tipe data-nya ditentukan oleh tipe data nilainya, cara kontradiktif jika dibandingkan dengan cara pertama. Dengan metode jenis ini, keyword var
dan tipe data tidak perlu ditulis.
var firstName string = "john"
lastName := "wick"
fmt.Printf("halo %s %s!\n", firstName, lastName)
Variabel lastName
dideklarasikan dengan menggunakan metode type inference. Penandanya tipe data tidak dituliskan pada saat deklarasi. Pada penggunaan metode ini, operand =
harus diganti dengan :=
dan keyword var
dihilangkan.
Tipe data lastName
secara otomatis akan ditentukan menyesuaikan value atau nilai-nya. Jika nilainya adalah berupa string
maka tipe data variabel adalah string
. Pada contoh di atas, nilainya adalah string "wick"
.
Diperbolehkan untuk tetap menggunakan keyword var
pada saat deklarasi meskipun tanpa menuliskan tipe data, dengan ketentuan tidak menggunakan tanda :=
, melainkan tetap menggunakan =
.
// menggunakan var, tanpa tipe data, menggunakan perantara "="
var firstName = "john"
// tanpa var, tanpa tipe data, menggunakan perantara ":="
lastName := "wick"
Kedua deklarasi di atas maksudnya sama. Silakan pilih yang nyaman di hati.
Tanda :=
hanya digunakan sekali di awal pada saat deklarasi. Untuk assignment nilai selanjutnya harus menggunakan tanda =
, contoh:
lastName := "wick"
lastName = "ethan"
lastName = "bourne"
Perlu diketahu, deklarasi menggunakan
:=
hanya bisa dilakukan di dalam blok fungsi.
Go mendukung metode deklarasi banyak variabel secara bersamaan, caranya dengan menuliskan variabel-variabel-nya dengan pembatas tanda koma (,
). Untuk pengisian nilainya-pun diperbolehkan secara bersamaan.
var first, second, third string
first, second, third = "satu", "dua", "tiga"
Pengisian nilai juga bisa dilakukan bersamaan pada saat deklarasi. Caranya dengan menuliskan nilai masing-masing variabel berurutan sesuai variabelnya dengan pembatas koma (,
).
var fourth, fifth, sixth string = "empat", "lima", "enam"
Kalau ingin lebih ringkas:
seventh, eight, ninth := "tujuh", "delapan", "sembilan"
Dengan menggunakan teknik type inference, deklarasi multi variabel bisa dilakukan untuk variabel-variabel yang tipe data satu sama lainnya berbeda.
one, isFriday, twoPointTwo, say := 1, true, 2.2, "hello"
Go memiliki aturan unik yang jarang dimiliki bahasa lain, yaitu tidak boleh ada satupun variabel yang menganggur. Artinya, semua variabel yang dideklarasikan harus digunakan. Jika ada variabel yang tidak digunakan tapi dideklarasikan, error akan muncul pada saat kompilasi dan program tidak akan bisa di-run.
Underscore (_
) adalah reserved variable yang bisa dimanfaatkan untuk menampung nilai yang tidak dipakai. Bisa dibilang variabel ini merupakan keranjang sampah.
_ = "belajar Golang"
_ = "Golang itu mudah"
name, _ := "john", "wick"
Pada contoh di atas, variabel name
akan berisikan text john
, sedang nilai wick
ditampung oleh variabel underscore, menandakan bahwa nilai tersebut tidak akan digunakan.
Variabel underscore adalah predefined, jadi tidak perlu menggunakan :=
untuk pengisian nilai, cukup dengan =
saja. Namun khusus untuk pengisian nilai multi variabel yang dilakukan dengan metode type inference, boleh didalamnya terdapat variabel underscore.
Biasanya variabel underscore sering dimanfaatkan untuk menampung nilai balik fungsi yang tidak digunakan.
Perlu diketahui, bahwa isi variabel underscore tidak dapat ditampilkan. Data yang sudah masuk variabel tersebut akan hilang. Ibaratkan variabel underscore seperti blackhole, objek apapun yang masuk kedalamnya, akan terjebak selamanya di-dalam singularity dan tidak akan bisa keluar 😁
Keyword new
digunakan untuk membuat variabel pointer dengan tipe data tertentu. Nilai data default-nya akan menyesuaikan tipe datanya.
name := new(string)
fmt.Println(name) // 0x20818a220
fmt.Println(*name) // ""
Variabel name
menampung data bertipe pointer string. Jika ditampilkan yang muncul bukanlah nilainya melainkan alamat memori nilai tersebut (dalam bentuk notasi heksadesimal). Untuk menampilkan nilai aslinya, variabel tersebut perlu di-dereference terlebih dahulu, menggunakan tanda asterisk (*
).
Mungkin untuk sekarang banyak yang akan bingung tentang apa itu pointer, namun tak apa, karena nantinya di Bab A.22. Pointer akan dikupas habis topik tersebut.
Keyword ini hanya bisa digunakan untuk pembuatan beberapa jenis variabel saja, yaitu:
- channel
- slice
- map
Dan lagi, mungkin banyak yang akan bingung. Ketika sudah masuk ke pembahasan masing-masing poin tersebut, akan terlihat apa kegunaan dari keyword make
ini.