Program mulai berjalan dari paket utama (main package).
Dalam satu project hanya boleh ada satu package main
Selain paket main, nama paket harus sama dengan nama folder.
Type
Go is a statically typed programming language
Setiap variabel, konstanta dan lain-lain memiliki type
tipe dasar :
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // alias untuk uint8
rune // alias untuk int32
// merepresentasikan sebuah kode Unicode
float32 float64
complex64 complex128
Ada tipe turunan seperti array, slice, map, interface, struct, dan function
Konstanta
const pi float64=22/7const ( alamat string="Gandaria City, Jakarta Selatan" email string="emailku@waresix.com")
Variabel
packagerepositories// contoh variabel yang siklus hidupnya ada dalam satu paket. // Seluruh kode dalam paket repositories, biarpun berbeda file bisa mengakses variabel inivar err errorfuncSatu() {// NOTE : siklus hidup variabel-variable ini hanya berlaku dalam fungsi Satu// variabel harus dideklarasikan terlebih dahuluvar a int// variable yang telah dideklarasikan bisa diisi dengan nilai yang sesuai a =1// variabel bisa dideklarasikan secara implisit dan sekaligus langsung diberi nilai. // tipe akan disematkan secara implisit pada variabel ini b :=2// siklus hidup variabel bisa hanya dalam blok yang membatasi. // blok bisa berupa blok if, for, fungsi atau bahkan hanya notasi blok saja. {var c string c ="variabel di dalam blok"println(c) }}
Siklus hidup variabel
packagerepositories// contoh variabel yang siklus hidupnya ada dalam satu paket. // Seluruh kode dalam paket repositories, biarpun berbeda file bisa mengakses variabel inivar err errorfuncSatu() {// siklus hidup variabel-variable ini hanya berlaku dalam fungsi Satuvar a int a =1 b :=2// siklus hidup variabel bisa hanya dalam blok yang membatasi. // blok bisa berupa blok if, for, fungsi atau bahkan hanya notasi blok saja. {var c string c ="variabel di dalam blok"println(c) }}
Pengoptimalan penggunaan memori dalam siklus hidup variabel
Jika ingin membuat variabel global dalam satu paket, sebaiknya pertimbangkan kembali, karena siklus hidupnya ada di seluruh kode dalam paket tersebut
Untuk menghemat memori, deklarasikan variabel sesuai dengan kebutuhan siklus hidupnya
packagemainfuncmain() {// variabel i akan tetap hidup walaupun looping for sudah selesai i :=0for i <10 {println(i) i++ }// variabel i hanya hidup dalam blok forfor i :=0; i <10; i++ {println(i) } myMap :=map[string]string{"Satu": "Ahad", "Dua": "Senin", "Tiga": "Selasa"}// variabel value dan ok tetap hidup walaupun blok if / if else sudah berakhir value, ok := myMap["Satu"]if ok {println(value) }// variabel value dan ok hanya hidup dalam blok if / if elseif value, ok := myMap["Dua"]; ok {println(value) } myName :=string("Jet Lee") { name :=string("Jacky")println(name) }println(myName)}
Package, Export dan Import
Semua type, var, const, func dalam suatu paket yang sama bisa dipanggil di manapun (meskipun berbeda file)
Untuk bisa dipanggil di paket lain, type, var, const, func harus diexport terlebih dahulu
Cara export dilakukan dengan memberi nama var, type, const, fungsi dll yang diawali dengan huruf besar
Jika suatu paket ingin menggunakan kode dari paket lainnya, harus mengimport terlebih dahulu
// file APP/latihan/satu.gopackagelatihan// MyStr adalah type yang diexporttypeMyStrstring// Salam adalah fungsi diexportfunc Salam (m MyStr) {println(m)cetaknama()}// cetaknama adalah fungsi privat yang tidak diexportfunc cetaknama () {println(nama)}
// file APP/latihan/dua.gopackagelatihan// nama var tidak diexport, tapi bisa gunakan di seluruh program dalam paket latihanvar nama string="Jacky"// PrintNama merupakan fungsi yang diexportfuncPrintNama() {println(nama)}
funcmain() { i :=10 p :=&i // menunjuk ke iprintln(*p) // baca i lewat pointer*p =20// set i lewat pointerprintln(i) // lihat nilai terbaru dari i}
Function
fungsi juga merupakan sebuah tipe
// contoh membuat type berupa fungsi typeHandlerfunc(http.ResponseWriter, *http.Request)typeCustomeHandlerfunc(http.ResponseWriter, *http.Request) error
Format fungsi : func NAMA (argument type) type_return
// Contoh membuat suatu fungsifunc Jumlah (a int, b int) int {return a+b}
typeoperasifunc(a int, b int) intfuncmain() {// Lambdaprintln(func() string {return"lambda" }())// Closurevar GetClosure =func() string {return"closure" }var closure string closure =GetClosure()println(closure)// Callback dengan lambda :: double squareprintln(square(func(i int) int {return i * i }, 2))// Callback dengan closure, dengan tipe data implisitvar Jumlah =func(a int, b int) int {return a + b }// Callback dengan closure, dengan tipe data explisitvar Kurang operasi=func(a int, b int) int {return a - b }println("Operasi Jumlah : ", Hitung(Jumlah, 5, 3))println("Operasi Kurang : ", Hitung(Kurang, 5, 3))}funcsquare(f func(int) int, x int) int {returnf(x * x)}funcHitung(o operasi, x int, y int) int {returno(x, y)}
Variadic Function
Merupakan fungsi dengan jumlah argumen yang dinamis.
Bisa dipanggil dengan cara biasa dengan argumen individual
Bisa dipanggil secara dinamis dengan melempar argumen slice...
funcsum(nums ...int) { total :=0for _, num :=range nums { total += num }println(total)}funcmain() {sum(1)sum(1, 2)sum(2, 3, 4) nums := []int{1, 2, 3, 4}sum(nums...)}
Flow Control
if
if err !=nil {return err}if err :=run(); err !=nil {return err}if b :=1; b <10 {println("blok if", b) } else {println("blok else", b)}
switch
funcmain() { fmt.Print("Go berjalan pada ")switch os := runtime.GOOS; os {case"darwin": fmt.Println("OS X.")case"linux": fmt.Println("Linux.")default:// freebsd, openbsd,// plan9, windows... fmt.Printf("%s.\n", os) } t := time.Now()switch {case t.Hour() <12: fmt.Println("Selamat pagi!")case t.Hour() <17: fmt.Println("Selamat sore.")default: fmt.Println("Selamat malam.") }}
for
funcmain() {// standard forfor i:=0; i<=10; i++ {println(i) }// while i :=0for i<=10 {println(i) i++ }// infinite loop i =0for {println(i)if i ==10 {break } i++ }// foreach array := []uint{0,1,2,3,4,5,6,7,8,9,10}for index, value :=range array {println(index, value) }}
defer
Perintah defer menunda eksekusi dari sebuah fungsi sampai fungsi yang melingkupinya selesai.
Argumen untuk pemanggilan defer dievaluasi langsung, tapi pemanggilan fungsi tidak dieksekusi sampai fungsi yang melingkupinya selesai.