07. Halo, Dunia

Program pertama yang biasa ditulis dalam bahasa apa pun adalah yang mencetak Hello, world! lalu berhenti. Kecil, tapi menulisnya membuktikan bahwa bahasa sudah terinstal, editor sudah siap, dan terminal bisa menjalankan file. Bab ini menulis program itu, sengaja membuatnya error, lalu memperbaikinya.

Program lengkapnya

Buka exercises/07/01-hello.go di VS Code. File tersebut berisi ini:

// Chapter 07 example: the first program.
// Run with: go run exercises/07/01-hello.go

package main

import "fmt"

func main() {
    fmt.Println("Hello, world!")
}

Di terminal VS Code, jalankan:

go run exercises/07/01-hello.go

Terminal mencetak:

Hello, world!

Itu saja programnya. Sisa bab ini menjelaskan setiap bagiannya.

Tiga bagian yang dibutuhkan setiap program

Dua baris pertama dimulai dengan //. Keduanya adalah komentar, catatan untuk manusia yang diabaikan Go. Baris-baris setelahnya adalah programnya, dan setiap program Go di bagian buku ini punya tiga bagian yang sama:

  • package main menyatakan bahwa file ini adalah program yang bisa dijalankan, bukan pustaka untuk dipakai program lain.
  • import "fmt" memasukkan fmt, bagian dari pustaka standar Go yang mencetak teks. Go hanya mengenal pustaka yang diminta oleh sebuah file.
  • func main() { ... } adalah tempat program dimulai. Go menjalankan baris-baris di antara kurung kurawal { dan }, dari atas ke bawah, lalu program selesai.

Untuk sekarang, anggap ketiga bagian ini sebagai bingkai yang kamu salin ke setiap file. Kode buatanmu sendiri ditulis di dalam main. Bab 21 menjelaskan fungsi secara lengkap, dan Bab 25 menjelaskan package dan import.

Baris di dalam main dimulai dengan satu tab. Go tidak membutuhkannya, tapi semua kode Go ditulis seperti itu, dan VS Code menambahkannya untukmu saat menyimpan.

Karena bagian-bagian ini tidak pernah berubah, buku ini sering hanya menampilkan baris yang masuk ke dalam main, seperti ini:

fmt.Println("Hello, world!")

Untuk mencoba baris seperti itu, taruh di dalam main pada file yang punya bagian-bagian lainnya.

Apa yang dilakukan go run

Go adalah bahasa yang dikompilasi. Komputer tidak bisa langsung menjalankan teks di dalam file .go, jadi sebuah program bernama compiler lebih dulu menerjemahkan seluruh file ke bentuk yang bisa dijalankan komputer.

go run melakukan kedua langkah dengan satu perintah:

  1. Mengompilasi file. Kalau compiler menemukan kesalahan di mana pun dalam file, compiler mencetak error dan berhenti. Tidak ada yang dijalankan, bahkan baris di atas kesalahan itu.
  2. Menjalankan program hasil kompilasi, lalu membuang salinan hasil kompilasi itu.

Itulah sebabnya tidak ada file .exe yang muncul di foldermu. Itu juga sebabnya go run bisa butuh waktu sebentar saat pertama kali dipakai.

Apa yang dilakukan fmt.Println

fmt.Println adalah sebuah fungsi — sepotong kode yang punya nama dan melakukan pekerjaan tertentu saat dipanggil. Namanya punya dua bagian: fmt adalah pustaka tempatnya berada, dan Println (singkatan dari "print line") adalah fungsinya. Pekerjaannya adalah menulis apa pun yang kamu berikan ke terminal, diikuti dengan baris baru.

Tanda kurung ( dan ) setelah nama adalah cara kamu meminta fungsi untuk berjalan. Apa pun di antara keduanya adalah yang kamu berikan.

fmt.Println("Hello, world!")
//          ^^^^^^^^^^^^^^^
//          inilah yang kita berikan ke fmt.Println

Dalam Go, hal-hal yang kamu berikan ke sebuah fungsi disebut argument. Program di atas memberikan satu argument ke fmt.Println: string "Hello, world!".

Ganti teks di dalam tanda kutip dengan namamu sendiri. Simpan dan jalankan lagi. Terminal sekarang harusnya mencetak namamu.

String

Teks "Hello, world!" adalah sebuah string — urutan karakter. Dalam Go, string ditulis di antara tanda kutip ganda ". Tanda kutip tunggal tidak menghasilkan string. fmt.Println('Hello, world!') berhenti dengan error more than one character in rune literal.

Ada cara kedua untuk menulis string, yaitu di antara backtick `. Cara ini berguna kalau teksnya sendiri mengandung tanda kutip ganda:

fmt.Println("Hello, world!")
fmt.Println(`Hello, "world"!`)

Tanda kutip bukan bagian dari string. Tanda kutip menandai di mana string dimulai dan di mana string berakhir. Saat string dicetak, hanya yang ada di antara tanda kutip yang muncul. Pada baris kedua di atas, tanda kutip ganda ada di antara backtick, jadi tanda kutip itu ikut dicetak.

Mencetak lebih dari satu hal

fmt.Println bisa menerima lebih dari satu argument. Pisahkan dengan koma. File exercises/07/02-multiple-arguments.go dimulai dengan baris ini di dalam main:

fmt.Println("Hello,", "world!")

Terminal mencetak Hello,, spasi, lalu world!, semua dalam satu baris. fmt.Println meletakkan spasi di antara setiap argument dan baris baru di akhir.

Untuk mengatur spasi sendiri, buat satu string dengan +, yang menyambungkan string:

fmt.Println("Hello, " + "world!")

Sekarang outputnya adalah Hello, world! dengan satu spasi di antara kata, karena spasi ada di dalam string pertama.

Bab 09 menampilkan fmt.Printf, cara yang lebih rapi untuk menggabungkan teks dan nilai.

Buat fmt.Println menampilkan tiga hal dalam satu baris: kata go, angka 1, dan kata is_fast. Jalankan. Perhatikan bahwa angka muncul meskipun tidak ada tanda kutip di sekitarnya.

Komentar

Sebuah komentar adalah teks yang diabaikan Go saat mengompilasi program. Komentar dibuat untuk manusia yang membaca kode. Komentar satu baris dimulai dengan //:

// Baris ini adalah komentar. Go tidak menjalankannya.
fmt.Println("Hello, world!") // Komentar juga bisa berada di akhir baris.

Untuk menulis blok catatan yang lebih panjang, gunakan beberapa baris // berturut-turut:

// Apa pun di sini diabaikan.
// Berguna untuk penjelasan panjang
// atau untuk mematikan sementara
// satu blok kode.
fmt.Println("Still runs.")

Gunakan komentar untuk menjelaskan mengapa kode melakukan sesuatu, bukan apa yang dilakukan setiap baris. Kode yang baik sudah mengatakan apa. File exercises/07/03-comments.go berisi contoh lainnya, dan Bab 08 membahas komentar secara rinci.

Membuat dan membaca error

Sekarang sengaja rusak programnya. Di 01-hello.go, hapus tanda kutip terakhir sehingga barisnya menjadi:

fmt.Println("Hello, world!)

Simpan dan jalankan. Go menolak menjalankan file dan mencetak error seperti ini:

# command-line-arguments
exercises\07\01-hello.go:9:29: newline in string
exercises\07\01-hello.go:9:29: syntax error: unexpected newline in argument list; possibly missing comma or )

Baris pertama, # command-line-arguments, hanya menyatakan bahwa Go sedang mengompilasi file yang kamu sebutkan. Kamu mengetik path dengan garis miring biasa, dan Go mencetaknya dengan backslash karena begitulah cara Windows menulis path. File-nya tetap sama.

Baca setiap baris error dalam urutan ini:

  1. Nama file dan nomor baris (01-hello.go:9). Di sinilah masalahnya. Lihat sini dulu.
  2. Kolom (29). Ini menunjukkan seberapa jauh di baris itu Go menyadari masalahnya, dihitung per karakter dari kiri. Tab dihitung satu.
  3. Pesan (newline in string). Ini adalah apa yang salah. Artinya Go melihat tanda kutip pembuka dan memulai sebuah string, tapi baris sudah berakhir sebelum penutupnya ditemukan.

Satu kesalahan bisa menghasilkan lebih dari satu baris. Di sini baris kedua adalah akibat dari baris pertama, jadi hanya ada satu hal yang perlu diperbaiki.

Error bukan hukuman. Error memberitahu kamu tepat di baris mana yang harus dilihat dan memberikan petunjuk apa yang salah.

Perbaiki tanda kutip yang hilang supaya program berjalan lagi. Kemudian coba kesalahan lain: ganti Println menjadi Prinln dan jalankan. Baca error baru yang muncul. Apa yang disampaikan oleh pesannya? (Tidak perlu menulis jawabannya. Perhatikan saja.)

Catatan tentang spasi dan huruf besar-kecil

Go tidak memakai indentasi (spasi dan tab di awal baris) untuk memahami kodemu. Tab tambahan tidak menyebabkan error. Programmer Go tetap memberi indentasi dengan satu cara standar, dan VS Code melakukannya untukmu saat menyimpan.

Go memperhatikan letak pemenggalan beberapa baris. Tanda { setelah func main() harus tetap di baris yang sama dengan func main(). Bab 10 menampilkan error yang muncul kalau tidak.

Go memperhatikan huruf besar dan kecil. Println adalah kata yang berbeda dari println dan PRINTLN. Nama di dalam fmt dimulai dengan huruf besar, dan fmt.println berhenti dengan error undefined: fmt.println.

PR

File PR ada di exercises/07/homework/. Buka setiap starter di VS Code, baca komentar di bagian atas, dan selesaikan file tersebut agar bisa dijalankan dan menghasilkan output yang diharapkan.

Sebagian besar starter sudah punya ketiga bagian tadi dan satu baris pengganti, fmt.Println("TODO: replace this line"). File seperti itu bisa langsung dijalankan dan mencetak baris tersebut. Ganti baris itu dengan kodemu sendiri. Baris pengganti itu ada karena Go menolak mengompilasi file yang meng-import fmt tanpa memakainya. Bab 08 menjelaskan hal ini.

Soal 1 — Sapa dirimu sendiri

Buka exercises/07/homework/01-greet-yourself.go. File ini berisi sebuah komentar dan baris pengganti. Tulis tiga panggilan fmt.Println agar saat dijalankan menampilkan, dalam tiga baris terpisah:

  • sapaan (pilih kata-katamu sendiri),
  • nama depanmu,
  • nama game favoritmu.

Soal 2 — Cetak sebuah kutipan

Buka exercises/07/homework/02-print-quote.go. Cetak sebuah kutipan terkenal di baris pertama dan nama pengarangnya di baris kedua dalam format ini:

"The best way to predict the future is to invent it."
                                            — Alan Kay

(Tanda strip sebelum nama pengarang bisa berupa tanda hubung biasa -. Spasi yang tepat tidak harus persis, asalkan kutipan ada di satu baris dan pengarang ada di baris berikutnya.)

Soal 3 — Perbaiki error-nya

Buka exercises/07/homework/03-fix-the-error.go. File ini tidak bisa dijalankan. Baca error yang dicetak Go, perbaiki file-nya, dan jalankan sampai kamu melihat:

All good now.

Ada lebih dari satu kesalahan dalam file tersebut. Temukan semuanya.

Tantangan — Cerita tiga baris

Buka exercises/07/homework/04-three-line-story.go. Tulis sebuah cerita mikro tiga baris di mana:

  • baris pertama menetapkan latar,
  • baris kedua memperkenalkan masalah,
  • baris ketiga menyelesaikan masalah.

Setiap baris harus dicetak oleh panggilan fmt.Println-nya sendiri. Tambahkan blok baris komentar // di bagian atas yang menjelaskan, dalam bahasa biasa, tentang apa ceritamu.

Stuck atau sudah selesai? Buka halaman solusi PR untuk penjelasan lengkap.