From 32d4930dd4ee3e959a3ed15746459f392923a821 Mon Sep 17 00:00:00 2001 From: Shulhan Date: Wed, 4 Feb 2026 19:03:30 +0700 Subject: _content: perbaikan tautan yang dilaporkan oleh jarink Untuk tautan yang belum ada terjemahannya, gunakan link ke situs asli. --- _content/berkontribusi.adoc | 4 +- _content/blog/codelab-share/index.adoc | 2 +- _content/blog/error-handling-and-go/index.adoc | 7 +- .../blog/get-familiar-with-workspaces/index.adoc | 2 +- .../index.adoc | 2 +- _content/blog/go-slices-usage-and-internals | 1 + .../go-slices-usage-and-internals_slice-1.png | Bin 6334 -> 0 bytes .../go-slices-usage-and-internals_slice-2.png | Bin 7220 -> 0 bytes .../go-slices-usage-and-internals_slice-3.png | Bin 7303 -> 0 bytes .../go-slices-usage-and-internals_slice-array.png | Bin 1237 -> 0 bytes .../go-slices-usage-and-internals_slice-struct.png | Bin 3650 -> 0 bytes .../blog/go-slices-usage-and-internals/index.adoc | 399 --------------------- _content/blog/godoc/index.adoc | 2 - _content/blog/gofmt/index.adoc | 2 +- _content/blog/introducing-go-playground/index.adoc | 2 +- _content/blog/json-and-go/index.adoc | 2 +- _content/blog/normalization/index.adoc | 8 +- _content/blog/organizing-go-code/index.adoc | 2 +- _content/blog/playground/index.adoc | 66 ++-- _content/blog/profiling-go-programs/index.adoc | 4 +- _content/blog/publishing-go-modules/index.adoc | 2 +- .../go-slices-usage-and-internals_slice-1.png | Bin 0 -> 6334 bytes .../go-slices-usage-and-internals_slice-2.png | Bin 0 -> 7220 bytes .../go-slices-usage-and-internals_slice-3.png | Bin 0 -> 7303 bytes .../go-slices-usage-and-internals_slice-array.png | Bin 0 -> 1237 bytes .../go-slices-usage-and-internals_slice-struct.png | Bin 0 -> 3650 bytes _content/blog/slices-intro/index.adoc | 399 +++++++++++++++++++++ _content/blog/survey2019/index.adoc | 2 +- .../index.adoc | 6 +- _content/cmd/go/index.adoc | 8 +- _content/doc/articles/go_command.adoc | 6 +- _content/doc/articles/wiki/index.adoc | 6 +- _content/doc/cmd/index.adoc | 2 +- _content/doc/database/index.adoc | 16 +- _content/doc/effective_go.adoc | 6 +- _content/doc/faq/index.adoc | 6 +- _content/doc/gdb/index.adoc | 3 +- _content/doc/install/gccgo/index.adoc | 2 +- _content/doc/install/index.adoc | 2 +- _content/doc/install/source/index.adoc | 4 +- .../doc/modules/managing-dependencies/index.adoc | 4 +- _content/doc/tutorial/call-module-code/index.adoc | 5 +- _content/doc/tutorial/create-module/index.adoc | 4 +- _content/doc/tutorial/database-access/index.adoc | 2 +- _content/doc/tutorial/getting-started/index.adoc | 2 +- _content/doc/tutorial/module-conclusion/index.adoc | 2 +- _content/doc/tutorial/workspaces/index.adoc | 6 +- 47 files changed, 500 insertions(+), 500 deletions(-) create mode 120000 _content/blog/go-slices-usage-and-internals delete mode 100644 _content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-1.png delete mode 100644 _content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-2.png delete mode 100644 _content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-3.png delete mode 100644 _content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-array.png delete mode 100644 _content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-struct.png delete mode 100644 _content/blog/go-slices-usage-and-internals/index.adoc create mode 100644 _content/blog/slices-intro/go-slices-usage-and-internals_slice-1.png create mode 100644 _content/blog/slices-intro/go-slices-usage-and-internals_slice-2.png create mode 100644 _content/blog/slices-intro/go-slices-usage-and-internals_slice-3.png create mode 100644 _content/blog/slices-intro/go-slices-usage-and-internals_slice-array.png create mode 100644 _content/blog/slices-intro/go-slices-usage-and-internals_slice-struct.png create mode 100644 _content/blog/slices-intro/index.adoc diff --git a/_content/berkontribusi.adoc b/_content/berkontribusi.adoc index 6555b78..23668cd 100644 --- a/_content/berkontribusi.adoc +++ b/_content/berkontribusi.adoc @@ -80,7 +80,7 @@ https://sr.ht/~shulhan/ciigo[kerangkanya^]: Berikut langkah-langkah untuk memulai pengembangan di komputer anda, Salin repositori ini ke dalam -link:/link/doc/code.html#Workspaces[ruang-kerja^] +link:/doc/code/[ruang-kerja^] Go anda ---- @@ -117,7 +117,7 @@ ciigo: starting HTTP server at ":5080" for "./_content" ---- Buka peramban pada alamat -http://127.0.0.1:5080 +\http://127.0.0.1:5080 (atau sesuai dengan port yang Anda berikan). Situs lokal dari golang-id.org akan muncul di halaman tersebut. diff --git a/_content/blog/codelab-share/index.adoc b/_content/blog/codelab-share/index.adoc index 6e869d3..1c88592 100644 --- a/_content/blog/codelab-share/index.adoc +++ b/_content/blog/codelab-share/index.adoc @@ -18,7 +18,7 @@ konkuren. (Konsep ini memiliki https://swtch.com/~rsc/thread/[sejarah yang menarik^] yang dimulai dari tulisan C. A. R. Hoare tentang -https://www.usingcsp.com/[_Communicating Sequential Processes_^].) +https://en.wikipedia.org/wiki/Communicating_sequential_processes[_Communicating Sequential Processes_^].) Alih-alih secara eksplisit menggunakan kunci untuk menengahi akses terhadap data yang dibagi, Go mendorong penggunaan _channel_ untuk mengirim referensi data antara _goroutine_. diff --git a/_content/blog/error-handling-and-go/index.adoc b/_content/blog/error-handling-and-go/index.adoc index 8ce69c1..cdf81ad 100644 --- a/_content/blog/error-handling-and-go/index.adoc +++ b/_content/blog/error-handling-and-go/index.adoc @@ -180,9 +180,10 @@ if err := dec.Decode(&val); err != nil { ---- (Contoh kode ini merupakan versi sederhana dari -https://github.com/camlistore/go4/blob/03efcb870d84809319ea509714dd6d19a1498483/jsonconfig/eval.go#L123-L135[kode sebenarnya^] +https://github.com/go4org/go4/blob/03efcb870d84809319ea509714dd6d19a1498483/jsonconfig/eval.go#L123-L135[kode +sebenarnya^] dari proyek -https://camlistore.org/[Camlistore^] +https://perkeep.org/[perkeep (previously known as Camlistore)^] .) Interface `error` hanya membutuhkan sebuah method `Error`; @@ -401,7 +402,7 @@ Berikut beberapa ide: Hal-hal tersebut adalah cara yang bagus untuk menghindari menampilkan kesalahan yang disebabkan oleh pemrograman kepada _user_. Lihat artikel - link:/blog/defer_panic_recover/[Defer Panic dan Recover^] + link:/blog/defer-panic-and-recover/["Defer, Panic, dan Recover"^] untuk lebih jelas. diff --git a/_content/blog/get-familiar-with-workspaces/index.adoc b/_content/blog/get-familiar-with-workspaces/index.adoc index b7e7036..e1c8180 100644 --- a/_content/blog/get-familiar-with-workspaces/index.adoc +++ b/_content/blog/get-familiar-with-workspaces/index.adoc @@ -294,7 +294,7 @@ gopls^] * Unduh dan pasang https://go.dev/dl/[Go yang terbaru^] * Coba menggunakan -link:/ref/mod#workspaces[ruang kerja^] +https://go.dev/ref/mod#workspaces[ruang kerja^] lewat link:/doc/tutorial/workspaces[Tutorial ruang kerja Go^] * Baca diff --git a/_content/blog/gif-decoder-exercise-in-go-interfaces/index.adoc b/_content/blog/gif-decoder-exercise-in-go-interfaces/index.adoc index 62ea398..206e44e 100644 --- a/_content/blog/gif-decoder-exercise-in-go-interfaces/index.adoc +++ b/_content/blog/gif-decoder-exercise-in-go-interfaces/index.adoc @@ -11,7 +11,7 @@ mesin, yang membuatnya menjadi pilihan yang bagus untuk pekerjaan-pekerjaan yang membutuhkan CPU seperti manipulasi gambar. Dengan semangat, kami mendemokan sebuah program bernama -https://moustach-io.appspot.com/[Moustachio] +https://web.archive.org/web/20190913143133/https://moustach-io.appspot.com/[Moustachio^] yang mempermudah mengubah sebuah gambar seperti berikut: image:/blog/gif-decoder-exercise-in-go-interfaces/gif-decoder-exercise-in-go-interfaces_image00.jpg[] diff --git a/_content/blog/go-slices-usage-and-internals b/_content/blog/go-slices-usage-and-internals new file mode 120000 index 0000000..2adac34 --- /dev/null +++ b/_content/blog/go-slices-usage-and-internals @@ -0,0 +1 @@ +slices-intro \ No newline at end of file diff --git a/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-1.png b/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-1.png deleted file mode 100644 index ba465cf..0000000 Binary files a/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-1.png and /dev/null differ diff --git a/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-2.png b/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-2.png deleted file mode 100644 index a57581e..0000000 Binary files a/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-2.png and /dev/null differ diff --git a/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-3.png b/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-3.png deleted file mode 100644 index 64ece5e..0000000 Binary files a/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-3.png and /dev/null differ diff --git a/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-array.png b/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-array.png deleted file mode 100644 index a533702..0000000 Binary files a/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-array.png and /dev/null differ diff --git a/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-struct.png b/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-struct.png deleted file mode 100644 index f9141fc..0000000 Binary files a/_content/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-struct.png and /dev/null differ diff --git a/_content/blog/go-slices-usage-and-internals/index.adoc b/_content/blog/go-slices-usage-and-internals/index.adoc deleted file mode 100644 index 2dbc250..0000000 --- a/_content/blog/go-slices-usage-and-internals/index.adoc +++ /dev/null @@ -1,399 +0,0 @@ -= Slice pada Go: penggunaan dan internal -:author: Andrew Gerrand -:date: 5 Januari 2011 - - -== Pendahuluan - -Tipe slice pada Go menyediakan cara yang mudah dan efisien untuk bekerja -dengan seurutan data bertipe. -Slice sama dengan array pada bahasa pemrograman lainnya, namun memiliki -beberapa properti yang tidak biasa. -Artikel ini akan menelaah apa itu slice dan bagaimana cara menggunakannya. - - -== Array - -Tipe slice adalah sebuah abstraksi yang dibangun di atas tipe array, jadi -untuk memahami slice kita harus memahami array terlebih dahulu. - -Definisi tipe dari sebuah array menspesifikasikan panjang dan tipe dari -elemen. -Contohnya, tipe `[4]int` merepresentasikan sebuah array dari empat integer. -Ukuran dari array tetap; -panjangnya adalah bagian dari tipenya -(`[4]int` dan `[5]int` adalah tipe yang berbeda dan tidak kompatibel). -Array bisa diakses dengan metode indeks pada biasanya, sehingga ekspresi -`s[n]` berarti mengakses elemen ke-n, yang mana `n` dimulai dari nol. - ----- -var a [4]int -a[0] = 1 -i := a[0] -// i == 1 ----- - -Array tidak perlu diinisiasi secara eksplisit; -nilai kosong dari sebuah array siap digunakan yang setiap elemennya yaitu -nilai kosong dari tipe array tersebut: - ----- -// a[2] == 0, nilai kosong dari tipe int ----- - -Representasi `[4]int` dalam memori yaitu empat integer yang berurutan: - -image:/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-array.png[] - -Array pada Go adalah nilai. -Sebuah variabel array menyatakan keseluruhan array: ia bukan pointer ke elemen -pertama (seperti halnya pada C). -Hal ini berarti bahwa saat kita mengisi atau mengirim nilai array, kita akan -membuat salinan dari isinya. -(Untuk mengindahkan penyalinan kita bisa mengirim sebuah pointer ke array, -namun hal ini berarti sebuah pointer ke sebuah array, bukan sebuah array.) -Bayangkan array adalah sebuah bentuk struct dengan indeks bukan dengan -field-field yang memiliki nama: sebuah nilai komposit yang berukuran tetap. - ----- -b := [2]string{"Penn", "Teller"} ----- - -Atau, kita bisa membuat _compiler_ menghitung elemen array secara otomatis: - ----- -b := [...]string{"Penn", "Teller"} ----- - -Dalam kedua kasus di atas, tipe dari b yaitu `[2]string`. - - -== Slice - -Array ada gunanya, namun tidak fleksibel, sehingga kita jarang melihatnya -dalam kode Go. -Slice, ada di mana saja. -Slice dibentuk dari array untuk menyediakan kemudahan dan kekuatan yang lebih. - -Spesifikasi tipe untuk sebuah slice yaitu `[]T`, yang mana `T` adalah tipe -dari elemen slice. -Tidak seperti tipe array, tipe slice tidak memiliki panjang. - -Sintaksis dari slice dideklarasikan seperti sintaksis array, namun tanpa -jumlah elemen: - ----- -letters := []string{"a", "b", "c", "d"} ----- - -Sebuah slice bisa dibuat dengan fungsi bawaan `make`, yang memiliki penanda, - ----- -func make([]T, len, cap) []T ----- - -yang mana `T` yaitu tipe elemen dari slice yang akan dibuat. -Fungsi `make` menerima sebuah tipe, panjang, dan kapasitas yang opsional. -Saat dipanggil, `make` mengalokasikan sebuah array dan mengembalikan sebuah -slice yang mengacu pada array tersebut. - ----- -var s []byte -s = make([]byte, 5, 5) -// s == []byte{0, 0, 0, 0, 0} ----- - -Bila argumen kapasitas diindahkan, ia akan sama nilainya dengan panjang yang -dispesifikasikan. -Berikut versi singkat dari kode yang sama: - ----- -s := make([]byte, 5) ----- - -Panjang dan kapasitas dari sebuah slice dapat diketahui menggunakan fungsi -bawaan `len` dan `cap`. - ----- -len(s) == 5 -cap(s) == 5 ----- - -Dua bagian berikut akan mendiskusikan hubungan antara panjang dan kapasitas. - -Nilai kosong dari sebuah slice adalah `nil`. -Fungsi `len` dan `cap` akan mengembalikan nilai 0 untuk slice yang nil. - -Sebuah slice juga dapat dibentuk dengan "memotong" slice atau array. -Pemotongan dilakukan dengan menspesifikasikan rentang setengah-terbuka dengan -dua indeks yang dipisahkan oleh tanda titik-dua. -Contohnya, ekspresi `b[1:4]` membuat sebuah slice yang mengikutkan elemen 1 -sampai 3 dari b (indeks dari pemotongan slice yaitu tetap dari 0 sampai 2). - ----- -b := []byte{'g', 'o', 'l', 'a', 'n', 'g'} -// b[1:4] == []byte{'o', 'l', 'a'}, berbagi penyimpanan yang sama dengan b. ----- - -Indeks awal dan akhir dari ekspresi pemotongan slice tidak harus diisi; -nilai bakunya yaitu nol dan panjang dari slice itu sendiri: - ----- -// b[:2] == []byte{'g', 'o'} -// b[2:] == []byte{'l', 'a', 'n', 'g'} -// b[:] == b ----- - -Berikut sintaksis untuk membuat sebuah slice dari sebuah array: - ----- -x := [3]string{"Лайка", "Белка", "Стрелка"} -s := x[:] // sebuah slice yang mengacu penyimpanan dari x. ----- - - -== Internal dari slice - -Sebuah slice yaitu _descriptor_ (yang mendeskripsikan) segmen dari array. -Ia terdiri dari pointer ke array, panjang dari segmen, dan kapasitasnya -(panjang maksimum dari segmen). - -image:/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-struct.png[] - -Variabel `s` yang kita buat sebelumnya dengan `make([]byte, 5)`, memiliki -struktur seperti berikut: - -image:/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-1.png[] - -Panjangnya yaitu jumlah elemen yang diacu oleh slice. -Kapasitasnya yaitu jumlah elemen pada array di belakangnya (dimulai dari -elemen pertama yang diacu oleh pointer pada slice). -Perbedaan antara panjang dan kapasitas akan terlihat jelas saat kita melihat -contoh-contoh selanjutnya. - -Saat kita memotong slice `s`, perhatikan perubahan pada struktur data slice -dan hubungannya dengan array di baliknya: - ----- -s = s[2:4] ----- - -image:/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-2.png[] - -Memotong slice tidak menyalin data dari slice. -Ia membuat sebuah nilai slice yang baru yang menunjuk ke array aslinya. -Hal ini membuat operasi slice efisien seperti memanipulasi indeks dari array. -Oleh karena itu, mengubah _elemen_ (bukan slice itu sendiri) dari hasil -pemotongan slice akan mengubah elemen di slice aslinya: - ----- -d := []byte{'r', 'o', 'a', 'd'} -e := d[2:] -// e == []byte{'a', 'd'} -e[1] = 'm' -// e == []byte{'a', 'm'} -// d == []byte{'r', 'o', 'a', 'm'} ----- - -Sebelumnya kita memotong `s` dengan panjang yang lebih kecil dari -kapasitasnya. -Kita dapat mengembangkan `s` sampai ke kapasitasnya dengan memotongnya -kembali: - ----- -s = s[:cap(s)] ----- - -image:/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-3.png[] - -Sebuah slice tidak dapat mengembang lebih dari kapasitasnya. -Mencoba melakukan hal tersebut akan menyebabkan panik _runtime_, seperti saat -melakukan pengindeksan di luar batas dari slice atau array. -Hal yang serupa, slice tidak bisa dipotong kecil dari nol untuk mengakses -elemen sebelumnya dalam array. - - -== Mengembangkan slice (fungsi copy dan append) - -Untuk meningkatkan kapasitas dari sebuah slice kita harus membuat slice yang -baru dan lebih besar dan menyalin isi dari slice asli ke dalamnya. -Teknik ini adalah cara implementasi array secara dinamis pada bahasa -pemrograman lain. -Contoh selanjutnya melipatgandakan kapasitas dari `s` dengan membuat slice -baru `t`, menyalin isi dari `s` ke `t`, dan kemudian menempatkan nilai slice -`t` ke `s`: - ----- -t := make([]byte, len(s), (cap(s)+1)*2) // +1 seandainya cap(s) == 0 -for i := range s { - t[i] = s[i] -} -s = t ----- - -Bagian pengulangan pada operasi di atas dapat dipermudah dengan fungsi bawaan -`copy`. -Seperti namanya, `copy` menyalin data dari slice sumber ke slice tujuan. -Ia mengembalikan jumlah elemen yang disalin. - ----- -func copy(dst, src []T) int ----- - -Fungsi `copy` mendukung penyalinan antara slice yang berbeda panjangnya (ia -hanya akan menyalin sampai jumlah elemen paling kecil). -Sebagai tambahan, `copy` dapat menangani slice sumber dan tujuan yang berbagi -array yang sama, menangani slice yang saling timpa dengan benar. - -Dengan menggunakan `copy`, kita dapat menyederhanakan potongan kode di atas: - ----- -t := make([]byte, len(s), (cap(s)+1)*2) -copy(t, s) -s = t ----- - -Operasi umum lainnya dari slice yaitu menambahkan data ke akhir slice. -Fungsi berikut menambahkan elemen byte ke sebuah slice dari byte, -mengembangkan slice jika perlu, dan mengembalikan nilai slice yang diperbarui: - ----- -func AppendByte(slice []byte, data ...byte) []byte { - m := len(slice) - n := m + len(data) - if n > cap(slice) { // jika perlu, alokasi ulang. - // Buat alokasi dua kali lebih besar dari yang dibutuhkan, - // untuk penambahan nantinya. - newSlice := make([]byte, (n+1)*2) - copy(newSlice, slice) - slice = newSlice - } - slice = slice[0:n] - copy(slice[m:n], data) - return slice -} ----- - -Kita gunakan fungsi `AppendByte` seperti berikut: - ----- -p := []byte{2, 3, 5} -p = AppendByte(p, 7, 11, 13) -// p == []byte{2, 3, 5, 7, 11, 13} ----- - -Fungsi seperti `AppendByte` berguna karena memberikan kontrol sepenuhnya -dalam mengembangkan isi dari slice. -Bergantung pada karakteristik program, fungsi tersebut bisa saja -mengalokasikan potongan yang lebih kecil atau besar, atau mengatur batas atas -dari ukuran realokasi. - -Namun kebanyakan program tidak perlu kontrol sepenuhnya, sehingga Go -menyediakan fungsi bawaan `append` yang berguna untuk tujuan umum; -fungsi `append` memiliki penanda - ----- -func append(s []T, x ...T) []T ----- - -Fungsi `append` menambahkan elemen-elemen `x` ke akhir dari slice `s`, dan -mengembangkan ukuran slice jika kapasitas lebih besar dibutuhkan. - ----- -a := make([]int, 1) -// a == []int{0} -a = append(a, 1, 2, 3) -// a == []int{0, 1, 2, 3} ----- - -Untuk menambahkan slice ke slice lainnya, gunakan ... untuk memperluas -argumen kedua menjadi sebuah daftar argumen. - ----- -a := []string{"John", "Paul"} -b := []string{"George", "Ringo", "Pete"} -a = append(a, b...) // sama dengan "append(a, b[0], b[1], b[2])" -// a == []string{"John", "Paul", "George", "Ringo", "Pete"} ----- - -Secara nilai kosong dari slice (`nil`) sifatnya seperti slice dengan panjang -nol, kita dapat mendeklarasikan sebuah variabel slice dan kemudian -menambahkan elemen-elemen dalam sebuah pengulangan: - ----- -// Filter mengembalikan sebuah slice baru yang menyimpan hanya elemen-elemen -// dari s yang memenuhi fungsi fn(). -func Filter(s []int, fn func(int) bool) []int { - var p []int // == nil - for _, v := range s { - if fn(v) { - p = append(p, v) - } - } - return p -} ----- - - -== Kesalahan yang umum - -Seperti yang disebutkan sebelumnya, memotong sebuah slice tidak menyalin array -di belakangnya. -Array yang utuh tetap tersimpan dalam memori sampai tidak ada lagi yang -memakainya. -Terkadang hal ini bisa membuat program menyimpan semua data di dalam memori -saat hanya sebagian kecil dari slice yang dibutuhkan. - -Sebagai contohnya, fungsi `FindDigits` berikut memuat sebuah berkas ke dalam -memori dan mencari seurutan digit numerik yang pertama, dan mengembalikan -urutan tersebut sebagai sebuah slice yang baru. - ----- -var digitRegexp = regexp.MustCompile("[0-9]+") - -func FindDigits(filename string) []byte { - b, _ := ioutil.ReadFile(filename) - return digitRegexp.Find(b) -} ----- - -Kode di atas berjalan seperti yang tertulis, namun `[]byte` yang dikembalikan -menunjuk ke array yang berisi seluruh berkas. -Karena slice mengacu ke array aslinya, selama slice tersebut masih digunakan -maka _garbage collector_ tidak dapat menghapus array; -beberapa byte yang terpakai dari berkas menahan seluruh isi berkas di dalam -memori. - -Untuk memperbaiki permasalahan ini kita dapat menyalin data yang perlu saja ke -slice yang baru sebelum dikembalikan: - ----- -func CopyDigits(filename string) []byte { - b, _ := ioutil.ReadFile(filename) - b = digitRegexp.Find(b) - c := make([]byte, len(b)) - copy(c, b) - return c -} ----- - -Versi lebih ringkas dari fungsi di atas dapat dibangun menggunakan `append`. -Cara ini adalah latihan bagi pembaca. - - -== Bacaan Lebih Lanjut - -link:/doc/effective_go.html[Efektif Go] -berisi perlakuan lebih dalam dari -link:/doc/effective_go.html#slices[slice] -dan -link:/doc/effective_go.html#arrays[array], -dan -link:/ref/spec/index.html[spesifikasi bahasa] -Go mendefinisikan -link:/ref/spec/index.html#Slice_types[slice] -dan -link:/ref/spec/index.html#Appending_and_copying_slices[fungsi-fungsi] -link:/ref/spec/index.html#Making_slices_maps_and_channels[pembantu] -link:/ref/spec/index.html#Length_and_capacity[yang berhubungan] -dengan slice. diff --git a/_content/blog/godoc/index.adoc b/_content/blog/godoc/index.adoc index 493a2f2..37d6b1b 100644 --- a/_content/blog/godoc/index.adoc +++ b/_content/blog/godoc/index.adoc @@ -98,8 +98,6 @@ kompatibilitas dengan program yang ada. Untuk menginformasikan bahwa sebuah pengidentifikasi sebaiknya tidak digunakan lagi, tambahkan sebuah paragraf pada komentar yang dimulai dengan "Deprecated:" diikuti dengan informasi tentang kenapa ia tidak digunakan lagi. -Ada beberapa contoh -https://golang.org/search?q=Deprecated:[pada pustaka standar^]. Ada beberapa aturan format yang Godoc gunakan saat mengonversi komentar ke HTML: diff --git a/_content/blog/gofmt/index.adoc b/_content/blog/gofmt/index.adoc index d5e8db6..0884bb0 100644 --- a/_content/blog/gofmt/index.adoc +++ b/_content/blog/gofmt/index.adoc @@ -68,7 +68,7 @@ https://github.com/golang/go/blob/release-branch.go1.1/misc/git/pre-commit[misc/ adalah pembantu pra-__commit__ yang menjaga supaya kode Go yang salah format tidak ter-__commit__. Jika Anda pengguna Mercurial, -https://bitbucket.org/fhs/hgstyle/overview[pembantu hgstyle^] +https://github.com/fhs/hgstyle[perkakas hgstyle^] menyediakan pembantu pra-__commit__ untuk gofmt. diff --git a/_content/blog/introducing-go-playground/index.adoc b/_content/blog/introducing-go-playground/index.adoc index e0c06ab..9745ebb 100644 --- a/_content/blog/introducing-go-playground/index.adoc +++ b/_content/blog/introducing-go-playground/index.adoc @@ -12,7 +12,7 @@ perkakas dokumentasi Go. Namun berita sebenarnya adalah tentang fitur baru: https://go.dev/[Go Playground^]. -image::https://go.dev/blog/introducing-go-playground_Untitled.png[Go Playground] +image::https://go.dev/blog/playground-intro/screenshot.png[Go Playground] Playground membolehkan siapa pun dengan peramban menulis kode Go yang kemudian kami kompilasi dan jalankan di server kami. diff --git a/_content/blog/json-and-go/index.adoc b/_content/blog/json-and-go/index.adoc index e1e986a..fa88731 100644 --- a/_content/blog/json-and-go/index.adoc +++ b/_content/blog/json-and-go/index.adoc @@ -11,7 +11,7 @@ Ia umumnya digunakan untuk komunikasi antara web back-end dan program JavaScript yang berjalan di peramban, namun ia digunakan diberbagai tempat lainnya juga. Situsnya, -https://json.org[json.org^], +https://www.json.org/json-en.html[json.org^], menyediakan definisi standar yang jelas dan ringkas. {package-json}[Paket json^] diff --git a/_content/blog/normalization/index.adoc b/_content/blog/normalization/index.adoc index a049161..fa3791a 100644 --- a/_content/blog/normalization/index.adoc +++ b/_content/blog/normalization/index.adoc @@ -74,7 +74,7 @@ Seperti yang telah dijelaskan juga dalam artikel tentang string, Go tidak menjamin bahwa karakter-karakter dalam sebuah string telah dinormalisasi. Namun, paket go.text dapat mengompensasi hal tersebut. Misalnya, paket -https://pkg.go.dev/code.google.com/p/go.text/collate[collate^], +https://pkg.go.dev/golang.org/x/text/collate[collate^], yang dapat mengurutkan string menurut bahasa tertentu, bekerja secara tepat dengan string yang tidak dinormalisasi. Paket-paket dalam go.text tidak selalu membutuhkan input yang telah @@ -85,7 +85,7 @@ Normalisasi ada biayanya namun ia cepat, terutama untuk pemeriksaan dan pencarian atau jika sebuah string bukanlah NFD atau NFC dan bisa dikonversi ke NFD dengan melakukan dekomposisi tanpa mengubah urutan byte-byte. Secara praktik, -https://www.macchiato.com/unicode/nfc-faq#TOC-How-much-text-is-already-NFC-[99.98%^] +https://www.macchiato.com/unicode-intl-sw/nfc-faq#h.h8uqckv6osay[99.98%^] isi halaman HTML di web dalam bentuk NFC (bila mengikutkan _markup_, nilai persentase akan lebih besar). Sejauh ini umumnya NFC dapat di-dekomposisi ke NFD tanpa perlu mengubah urutan @@ -178,7 +178,7 @@ Atau Anda bisa mengeluarkan teks sebagai NFC seperti yang kebanyakan orang lakukan. Untuk menulis teks sebagai NFC, gunakan paket -https://pkg.go.dev/code.google.com/p/go.text/unicode/norm[unicode/norm^] +https://pkg.go.dev/golang.org/x/text/unicode/norm[unicode/norm^] untuk membungkus `io.Writer`: ---- @@ -370,4 +370,4 @@ waktu. == Artikel terkait -* link:/blogs/strings/[String, byte, rune, dan karakter dalam Go^] +* link:/blog/strings/[String, byte, rune, dan karakter dalam Go^] diff --git a/_content/blog/organizing-go-code/index.adoc b/_content/blog/organizing-go-code/index.adoc index 75cfb45..b3a312b 100644 --- a/_content/blog/organizing-go-code/index.adoc +++ b/_content/blog/organizing-go-code/index.adoc @@ -136,5 +136,5 @@ https://go.dev/src/cmd/go/[34 berkas^]. Dokumentasi yang bagus adalah kualitas yang penting untuk kode yang berguna dan mudah dipelihara. Bacalah artikel -link:/blog/godoc_documenting_go_code/[Godoc: mendokumentasikan kode Go^] +link:/blog/godoc/[Godoc: mendokumentasikan kode Go^] untuk belajar bagaimana menulis dokumentasi kode yang bagus. diff --git a/_content/blog/playground/index.adoc b/_content/blog/playground/index.adoc index 600bf75..49977ec 100644 --- a/_content/blog/playground/index.adoc +++ b/_content/blog/playground/index.adoc @@ -37,7 +37,7 @@ image:https://go.dev/blog/playground/overview.png[] Layanan playground memiliki tiga bagian: -* Sebuah _back-end_ yang berjalan di server Google. +* Sebuah _backend_ yang berjalan di server Google. Ia menerima permintaan RPC, mengompilasi program menggunakan perkakas go, mengeksekusi program, dan mengembalikan keluaran program (atau kesalahan kompilasi) sebagai respons RPC. @@ -45,24 +45,24 @@ Layanan playground memiliki tiga bagian: * Sebuah _front-end_ yang berjalan di https://cloud.google.com/appengine/docs/go/[Google App Engine^]. Ia menerima permintaan HTTP dari klien dan membuat permintaan RPC ke - _back-end_. + _backend_. Ia juga melakukan beberapa _caching_. * Sebuah klien JavaScript yang mengimplementasikan antar muka dan membuat permintaan HTTP ke _front-end_. -== Back-end +== _Backend_ -Program back-end itu sendiri cukup biasa, jadi kita tidak akan mendiskusikan +Program _backend_ itu sendiri cukup biasa, jadi kita tidak akan mendiskusikan implementasinya di sini. Bagian yang menarik yaitu bagaimana kita mengeksekusi kode secara aman dalam sebuah lingkungan terjaga dengan tetap menyediakan fungsionalitas inti seperti waktu, jaringan, dan sistem berkas. -Untuk mengisolasi program pengguna dari infrastruktur Google, back-end +Untuk mengisolasi program pengguna dari infrastruktur Google, _backend_ menjalankan program dengan -https://developers.google.com/native-client/[Native Client^] +https://developer.chrome.com/docs/native-client/[Native Client^] (atau "NaCl"), sebuah teknologi yang dikembangkan oleh Google untuk membolehkan eksekusi program x86 dengan aman di dalam peramban. @@ -105,8 +105,8 @@ Fasilitas-fasilitas tersebut dijelaskan dalam bagian-bagian di bawah ini. Program-program yang berjalan di playground dibatasi jumlah waktu CPU dan memori yang dapat mereka gunakan, tetapi mereka juga dibatasi dalam berapa banyak waktu yang dapat mereka gunakan. -Hal ini karena setiap program yang berjalan mengonsumsi sumber pada back-end -dan pada infrastruktur antara klien dan back-end. +Hal ini karena setiap program yang berjalan mengonsumsi sumber pada _backend_ +dan pada infrastruktur antara klien dan _backend_. Membatasi _run-time_ dari setiap program di playground membuat layanan kita lebih dapat diprediksi dan menjaga kita dari serangan _denial of service_. @@ -157,7 +157,7 @@ dan https://go.dev/cl/73110043[time.goc^]. Pemalsuan waktu memperbaiki beberapa isu dari penggunaan sumber daya pada -back-end, tetapi bagaimana dengan keluaran program? +_backend_, tetapi bagaimana dengan keluaran program? Akan aneh melihat sebuah program yang tertidur berjalan sampai selesai dengan benar tanpa menghabiskan waktu sama sekali. @@ -182,7 +182,7 @@ func main() { ---- Bagaimana ia bekerja? -Ia bekerja dengan kolaborasi antara back-end, front-end, dan klien. +Ia bekerja dengan kolaborasi antara _backend_, front-end, dan klien. Kita menangkap tempo pada setiap penulisan ke standar keluaran dan eror dan mengirimnya ke klien. @@ -285,18 +285,18 @@ berkas yang dapat digunakan dalam contoh-contoh dokumentasi, artikel blog, dan tur Go. Implementasinya dapat ditemukan dalam berkas -https://github.com/golang/go/blob/master/src/syscall/fs_nacl.go[fs_nacl.go^] +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/fs_nacl.go[fs_nacl.go^] dan -https://github.com/golang/go/blob/master/src/syscall/fd_nacl.go[fd_nacl.go^] +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/fd_nacl.go[fd_nacl.go^] (yang dibangun ke paket `syscall` hanya bila `GOOS` di set ke `nacl`). Sistem berkas itu sendiri direpresentasikan oleh -https://github.com/golang/go/blob/master/src/syscall/fs_nacl.go#L26[struct fsys^], +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/fs_nacl.go#L26[struct fsys^], yang mana sebuah instansi global (bernama `fs`) dibuat saat inisiasi. Beragam fungsi-fungsi berkas beroperasi terhadap `fs` bukan melakukan pemanggilan sistem secara langsung. Misalnya, berikut fungsi -https://github.com/golang/go/blob/master/src/syscall/fs_nacl.go#L473[syscall.Open^]: +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/fs_nacl.go#L473[syscall.Open^]: ---- func Open(path string, openmode int, perm uint32) (fd int, err error) { @@ -311,17 +311,17 @@ func Open(path string, openmode int, perm uint32) (fd int, err error) { ---- Penanda berkas (_file descriptor_) dilacak oleh sebuah slice global bernama -https://github.com/golang/go/blob/master/src/syscall/fd_nacl.go#L17[`files`^]. +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/fd_nacl.go#L17[`files`^] Setiap penanda berkas berkorespondensi dengan sebuah -https://github.com/golang/go/blob/master/src/syscall/fd_nacl.go#L23[`file`^] +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/fd_nacl.go#L23[`file`^] dan setiap `file` menyediakan nilai yang mengimplementasikan interface -https://github.com/golang/go/blob/master/src/syscall/fd_nacl.go#L30[`fileImpl`^]. +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/fd_nacl.go#L30[`fileImpl`^]. Ada beberapa implementasi dari interface tersebut: * Berkas dan perangkat biasa (seperti `/dev/random`) direpresentasikan oleh -https://github.com/golang/go/blob/master/src/syscall/fs_nacl.go#L58[`fsysFile`^], +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/fs_nacl.go#L58[`fsysFile`^], * Standar masukan, keluaran, dan eror adalah instansi dari -https://github.com/golang/go/blob/master/src/syscall/fd_nacl.go#L216[`naclFile`^], +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/fd_nacl.go#L216[`naclFile`^], yang menggunakan pemanggilan sistem untuk berinteraksi dengan berkas yang sebenarnya (hal ini adalah satu-satunya cara program berinteraksi dengan dunia luar), @@ -378,20 +378,20 @@ Pemalsuan jaringan harus dapat menyimulasikan _timeout_ baca dan tulis, tipe-tipe alamat dan protokol yang berbeda, dan seterusnya. Implementasi tersebut dapat ditemukan dalam -https://github.com/golang/go/blob/master/src/syscall/net_nacl.go[net_nacl.go^]. +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/net_nacl.go[net_nacl.go^]. Bagian awal yang bagus untuk dibaca yaitu -https://github.com/golang/go/blob/master/src/syscall/net_nacl.go#L461[netFile^], +https://github.com/golang/go/blob/release-branch.go1.13/src/syscall/net_nacl.go#L461[netFile^], implementasi dari jaringan socket dari interface `fileImpl`. == Front-end Front-end dari playground adalah program sederhana (kurang dari 100 baris). -Ia menerima permintaan HTTP dari klien, membuat permintaan RPC ke back-end, +Ia menerima permintaan HTTP dari klien, membuat permintaan RPC ke _backend_, dan melakukan semacam penyimpanan sementara (_caching_). Front-end melayani HTTP dengan sebuah _handler_ di -https://go.dev/compile[golang.org/compile^]. +https://go.dev/_/compile[go.dev/_/compile^]. Handler tersebut menerima permintaan POST dengan bagian `body` (program Go yang akan dijalankan) dan kolom `version` opsional (untuk klien pada umumnya nilainya "2"). @@ -404,9 +404,9 @@ Jika ditemukan, ia akan mengembalikan respons yang tersimpan tersebut. _Cache_ tersebut mencegah program yang umum seperti yang dapat kita temukan pada https://go.dev/[halaman depan Go^] -dari menghabiskan sumber daya pada back-end. +dari menghabiskan sumber daya pada _backend_. Jika tidak ada respons yang tersimpan, front-end melakukan pemanggilan RPC ke -back-end, menyimpan respons ke dalam memcache, membaca even-event, dan +_backend_, menyimpan respons ke dalam memcache, membaca even-event, dan mengembalikan sebuah objek JSON ke klien sebagai respons HTTP (seperti yang dijelaskan di atas). @@ -418,33 +418,33 @@ untuk menyiapkan antarmuka pengguna (kotak kode dan keluaran, tombol "Run", dan lainnya) dan berkomunikasi dengan front-end playground. Implementasinya ada dalam berkas -https://github.com/golang/tools/blob/master/godoc/static/playground.js[playground.js^] +https://github.com/golang/tools/blob/release-branch.go1.13/godoc/static/playground.js[playground.js^] dalam repositori `go.tools`, yang dapat diimpor dari paket https://pkg.go.dev/golang.org/x/tools/godoc/static[`golang.org/x/tools/godoc/static`^]. Beberapa kodenya cukup bersih dan beberapa cukup kasar karena ia adalah hasil gabungan dari beberapa implementasi dari kode klien. Fungsi -https://github.com/golang/tools/blob/master/godoc/static/playground.js#L227[playground^] +https://github.com/golang/tools/blob/release-branch.go1.13/godoc/static/playground.js#L316[playground^] membaca beberapa elemen HTML dan mengubahnya menjadi _widget_ playground yang interaktif. Anda sebaiknya menggunakan fungsi ini jika Anda ingin menempatkan playground pada situs Anda (lihat `Klien lain` di bawah). Interface -https://github.com/golang/tools/blob/master/godoc/static/playground.js#L6[`Transport`^] +https://github.com/golang/tools/blob/release-branch.go1.13/godoc/static/playground.js#L6[`Transport`^] (tidak secara formal terdefinisi) mengabstraksi antarmuka pengguna untuk berkomunikasi ke front-end web. -https://github.com/golang/tools/blob/master/godoc/static/playground.js#L43[HTTPTransport^] +https://github.com/golang/tools/blob/release-branch.go1.13/godoc/static/playground.js#L46[HTTPTransport^] adalah sebuah implementasi dari `Transport` menggunakan protokol HTTP seperti yang dijelaskan di atas. -https://github.com/golang/tools/blob/master/godoc/static/playground.js#L115[SocketTransport^] +https://github.com/golang/tools/blob/release-branch.go1.13/godoc/static/playground.js#L185[SocketTransport^] adalah implementasi menggunakan WebSocket (lihat "Eksekusi luring" di bawah). Untuk memenuhi https://en.wikipedia.org/wiki/Same-origin_policy[aturan same-origin^], beberapa server web (godoc, misalnya) mengirim permintaan ke `/compile` lewat -layanan proxy playground di https://golang.org/compile. +layanan proxy playground di https://go.dev/_/compile . Paket https://pkg.go.dev/golang.org/x/tools/playground[golang.org/x/tools^] membantu melakukan hal ini. @@ -461,12 +461,12 @@ Hal ini bagus untuk yang memiliki koneksi internet yang terbatas atau untuk presentasi yang tidak dapat (dan _sebaiknya_ tidak) bergantung pada koneksi internet yang selalu bekerja baik. -Untuk eksekusi secara luring, perkakas menjalankan versi back-end +Untuk eksekusi secara luring, perkakas menjalankan versi _backend_ playground-nya sendiri di mesin lokal. Back-end menggunakan perkakas Go biasa tanpa ada modifikasi yang disebutkan di atas dan menggunakan WebSocket untuk berkomunikasi dengan klien. -Implementasi WebSocket untuk back-end dapat ditemukan dalam paket +Implementasi WebSocket untuk _backend_ dapat ditemukan dalam paket https://pkg.go.dev/golang.org/x/tools/playground/socket[golang.org/x/tools/playground/socket^]. Wicara https://talks.golang.org/2012/insidepresent.slide#1[Inside Present^] diff --git a/_content/blog/profiling-go-programs/index.adoc b/_content/blog/profiling-go-programs/index.adoc index 2c84258..7deffac 100644 --- a/_content/blog/profiling-go-programs/index.adoc +++ b/_content/blog/profiling-go-programs/index.adoc @@ -219,7 +219,7 @@ https://www.graphviz.org/[graphviz^] ---- Potongan kecil dari -https://rawgit.com/rsc/benchgraffiti/master/havlak/havlak1.svg[grafik^] +https://htmlpreview.github.io/?https://github.com/rsc/benchgraffiti/blob/master/havlak/havlak1.svg[grafik^] berbentuk seperti ini: image:/blog/profiling-go-programs/profiling-go-programs_havlak1a-75.png[,650] @@ -285,7 +285,7 @@ _assembly_ bukan menampilkan daftar sumber kode; bila jumlah sampel cukup perintah tersebut dapat membantu Anda melihat instruksi mana yang memakan biaya. Perintah `weblist` menggabungkan kedua mode tersebut: ia memperlihatkan -https://rawgit.com/rsc/benchgraffiti/master/havlak/havlak1.html[daftar sumber kode^] +https://htmlpreview.github.io/?https://github.com/rsc/benchgraffiti/blob/master/havlak/havlak1.html[daftar sumber kode^] dan pada saat sebuah baris di klik ia akan menampilkan _assembly_ dari baris tersebut. diff --git a/_content/blog/publishing-go-modules/index.adoc b/_content/blog/publishing-go-modules/index.adoc index 22dd3e2..6c4be5e 100644 --- a/_content/blog/publishing-go-modules/index.adoc +++ b/_content/blog/publishing-go-modules/index.adoc @@ -20,7 +20,7 @@ Artikel ini menggunakan https://git-scm.com/[Git^] sebagai contoh. https://www.mercurial-scm.org/[Mercurial^], -https://wiki.bazaar.canonical.com/[Bazaar^], +https://launchpad.net/bzr[Bazaar^], dan perkakas sistem kontrol versi lainnya juga didukung. diff --git a/_content/blog/slices-intro/go-slices-usage-and-internals_slice-1.png b/_content/blog/slices-intro/go-slices-usage-and-internals_slice-1.png new file mode 100644 index 0000000..ba465cf Binary files /dev/null and b/_content/blog/slices-intro/go-slices-usage-and-internals_slice-1.png differ diff --git a/_content/blog/slices-intro/go-slices-usage-and-internals_slice-2.png b/_content/blog/slices-intro/go-slices-usage-and-internals_slice-2.png new file mode 100644 index 0000000..a57581e Binary files /dev/null and b/_content/blog/slices-intro/go-slices-usage-and-internals_slice-2.png differ diff --git a/_content/blog/slices-intro/go-slices-usage-and-internals_slice-3.png b/_content/blog/slices-intro/go-slices-usage-and-internals_slice-3.png new file mode 100644 index 0000000..64ece5e Binary files /dev/null and b/_content/blog/slices-intro/go-slices-usage-and-internals_slice-3.png differ diff --git a/_content/blog/slices-intro/go-slices-usage-and-internals_slice-array.png b/_content/blog/slices-intro/go-slices-usage-and-internals_slice-array.png new file mode 100644 index 0000000..a533702 Binary files /dev/null and b/_content/blog/slices-intro/go-slices-usage-and-internals_slice-array.png differ diff --git a/_content/blog/slices-intro/go-slices-usage-and-internals_slice-struct.png b/_content/blog/slices-intro/go-slices-usage-and-internals_slice-struct.png new file mode 100644 index 0000000..f9141fc Binary files /dev/null and b/_content/blog/slices-intro/go-slices-usage-and-internals_slice-struct.png differ diff --git a/_content/blog/slices-intro/index.adoc b/_content/blog/slices-intro/index.adoc new file mode 100644 index 0000000..2dbc250 --- /dev/null +++ b/_content/blog/slices-intro/index.adoc @@ -0,0 +1,399 @@ += Slice pada Go: penggunaan dan internal +:author: Andrew Gerrand +:date: 5 Januari 2011 + + +== Pendahuluan + +Tipe slice pada Go menyediakan cara yang mudah dan efisien untuk bekerja +dengan seurutan data bertipe. +Slice sama dengan array pada bahasa pemrograman lainnya, namun memiliki +beberapa properti yang tidak biasa. +Artikel ini akan menelaah apa itu slice dan bagaimana cara menggunakannya. + + +== Array + +Tipe slice adalah sebuah abstraksi yang dibangun di atas tipe array, jadi +untuk memahami slice kita harus memahami array terlebih dahulu. + +Definisi tipe dari sebuah array menspesifikasikan panjang dan tipe dari +elemen. +Contohnya, tipe `[4]int` merepresentasikan sebuah array dari empat integer. +Ukuran dari array tetap; +panjangnya adalah bagian dari tipenya +(`[4]int` dan `[5]int` adalah tipe yang berbeda dan tidak kompatibel). +Array bisa diakses dengan metode indeks pada biasanya, sehingga ekspresi +`s[n]` berarti mengakses elemen ke-n, yang mana `n` dimulai dari nol. + +---- +var a [4]int +a[0] = 1 +i := a[0] +// i == 1 +---- + +Array tidak perlu diinisiasi secara eksplisit; +nilai kosong dari sebuah array siap digunakan yang setiap elemennya yaitu +nilai kosong dari tipe array tersebut: + +---- +// a[2] == 0, nilai kosong dari tipe int +---- + +Representasi `[4]int` dalam memori yaitu empat integer yang berurutan: + +image:/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-array.png[] + +Array pada Go adalah nilai. +Sebuah variabel array menyatakan keseluruhan array: ia bukan pointer ke elemen +pertama (seperti halnya pada C). +Hal ini berarti bahwa saat kita mengisi atau mengirim nilai array, kita akan +membuat salinan dari isinya. +(Untuk mengindahkan penyalinan kita bisa mengirim sebuah pointer ke array, +namun hal ini berarti sebuah pointer ke sebuah array, bukan sebuah array.) +Bayangkan array adalah sebuah bentuk struct dengan indeks bukan dengan +field-field yang memiliki nama: sebuah nilai komposit yang berukuran tetap. + +---- +b := [2]string{"Penn", "Teller"} +---- + +Atau, kita bisa membuat _compiler_ menghitung elemen array secara otomatis: + +---- +b := [...]string{"Penn", "Teller"} +---- + +Dalam kedua kasus di atas, tipe dari b yaitu `[2]string`. + + +== Slice + +Array ada gunanya, namun tidak fleksibel, sehingga kita jarang melihatnya +dalam kode Go. +Slice, ada di mana saja. +Slice dibentuk dari array untuk menyediakan kemudahan dan kekuatan yang lebih. + +Spesifikasi tipe untuk sebuah slice yaitu `[]T`, yang mana `T` adalah tipe +dari elemen slice. +Tidak seperti tipe array, tipe slice tidak memiliki panjang. + +Sintaksis dari slice dideklarasikan seperti sintaksis array, namun tanpa +jumlah elemen: + +---- +letters := []string{"a", "b", "c", "d"} +---- + +Sebuah slice bisa dibuat dengan fungsi bawaan `make`, yang memiliki penanda, + +---- +func make([]T, len, cap) []T +---- + +yang mana `T` yaitu tipe elemen dari slice yang akan dibuat. +Fungsi `make` menerima sebuah tipe, panjang, dan kapasitas yang opsional. +Saat dipanggil, `make` mengalokasikan sebuah array dan mengembalikan sebuah +slice yang mengacu pada array tersebut. + +---- +var s []byte +s = make([]byte, 5, 5) +// s == []byte{0, 0, 0, 0, 0} +---- + +Bila argumen kapasitas diindahkan, ia akan sama nilainya dengan panjang yang +dispesifikasikan. +Berikut versi singkat dari kode yang sama: + +---- +s := make([]byte, 5) +---- + +Panjang dan kapasitas dari sebuah slice dapat diketahui menggunakan fungsi +bawaan `len` dan `cap`. + +---- +len(s) == 5 +cap(s) == 5 +---- + +Dua bagian berikut akan mendiskusikan hubungan antara panjang dan kapasitas. + +Nilai kosong dari sebuah slice adalah `nil`. +Fungsi `len` dan `cap` akan mengembalikan nilai 0 untuk slice yang nil. + +Sebuah slice juga dapat dibentuk dengan "memotong" slice atau array. +Pemotongan dilakukan dengan menspesifikasikan rentang setengah-terbuka dengan +dua indeks yang dipisahkan oleh tanda titik-dua. +Contohnya, ekspresi `b[1:4]` membuat sebuah slice yang mengikutkan elemen 1 +sampai 3 dari b (indeks dari pemotongan slice yaitu tetap dari 0 sampai 2). + +---- +b := []byte{'g', 'o', 'l', 'a', 'n', 'g'} +// b[1:4] == []byte{'o', 'l', 'a'}, berbagi penyimpanan yang sama dengan b. +---- + +Indeks awal dan akhir dari ekspresi pemotongan slice tidak harus diisi; +nilai bakunya yaitu nol dan panjang dari slice itu sendiri: + +---- +// b[:2] == []byte{'g', 'o'} +// b[2:] == []byte{'l', 'a', 'n', 'g'} +// b[:] == b +---- + +Berikut sintaksis untuk membuat sebuah slice dari sebuah array: + +---- +x := [3]string{"Лайка", "Белка", "Стрелка"} +s := x[:] // sebuah slice yang mengacu penyimpanan dari x. +---- + + +== Internal dari slice + +Sebuah slice yaitu _descriptor_ (yang mendeskripsikan) segmen dari array. +Ia terdiri dari pointer ke array, panjang dari segmen, dan kapasitasnya +(panjang maksimum dari segmen). + +image:/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-struct.png[] + +Variabel `s` yang kita buat sebelumnya dengan `make([]byte, 5)`, memiliki +struktur seperti berikut: + +image:/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-1.png[] + +Panjangnya yaitu jumlah elemen yang diacu oleh slice. +Kapasitasnya yaitu jumlah elemen pada array di belakangnya (dimulai dari +elemen pertama yang diacu oleh pointer pada slice). +Perbedaan antara panjang dan kapasitas akan terlihat jelas saat kita melihat +contoh-contoh selanjutnya. + +Saat kita memotong slice `s`, perhatikan perubahan pada struktur data slice +dan hubungannya dengan array di baliknya: + +---- +s = s[2:4] +---- + +image:/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-2.png[] + +Memotong slice tidak menyalin data dari slice. +Ia membuat sebuah nilai slice yang baru yang menunjuk ke array aslinya. +Hal ini membuat operasi slice efisien seperti memanipulasi indeks dari array. +Oleh karena itu, mengubah _elemen_ (bukan slice itu sendiri) dari hasil +pemotongan slice akan mengubah elemen di slice aslinya: + +---- +d := []byte{'r', 'o', 'a', 'd'} +e := d[2:] +// e == []byte{'a', 'd'} +e[1] = 'm' +// e == []byte{'a', 'm'} +// d == []byte{'r', 'o', 'a', 'm'} +---- + +Sebelumnya kita memotong `s` dengan panjang yang lebih kecil dari +kapasitasnya. +Kita dapat mengembangkan `s` sampai ke kapasitasnya dengan memotongnya +kembali: + +---- +s = s[:cap(s)] +---- + +image:/blog/go-slices-usage-and-internals/go-slices-usage-and-internals_slice-3.png[] + +Sebuah slice tidak dapat mengembang lebih dari kapasitasnya. +Mencoba melakukan hal tersebut akan menyebabkan panik _runtime_, seperti saat +melakukan pengindeksan di luar batas dari slice atau array. +Hal yang serupa, slice tidak bisa dipotong kecil dari nol untuk mengakses +elemen sebelumnya dalam array. + + +== Mengembangkan slice (fungsi copy dan append) + +Untuk meningkatkan kapasitas dari sebuah slice kita harus membuat slice yang +baru dan lebih besar dan menyalin isi dari slice asli ke dalamnya. +Teknik ini adalah cara implementasi array secara dinamis pada bahasa +pemrograman lain. +Contoh selanjutnya melipatgandakan kapasitas dari `s` dengan membuat slice +baru `t`, menyalin isi dari `s` ke `t`, dan kemudian menempatkan nilai slice +`t` ke `s`: + +---- +t := make([]byte, len(s), (cap(s)+1)*2) // +1 seandainya cap(s) == 0 +for i := range s { + t[i] = s[i] +} +s = t +---- + +Bagian pengulangan pada operasi di atas dapat dipermudah dengan fungsi bawaan +`copy`. +Seperti namanya, `copy` menyalin data dari slice sumber ke slice tujuan. +Ia mengembalikan jumlah elemen yang disalin. + +---- +func copy(dst, src []T) int +---- + +Fungsi `copy` mendukung penyalinan antara slice yang berbeda panjangnya (ia +hanya akan menyalin sampai jumlah elemen paling kecil). +Sebagai tambahan, `copy` dapat menangani slice sumber dan tujuan yang berbagi +array yang sama, menangani slice yang saling timpa dengan benar. + +Dengan menggunakan `copy`, kita dapat menyederhanakan potongan kode di atas: + +---- +t := make([]byte, len(s), (cap(s)+1)*2) +copy(t, s) +s = t +---- + +Operasi umum lainnya dari slice yaitu menambahkan data ke akhir slice. +Fungsi berikut menambahkan elemen byte ke sebuah slice dari byte, +mengembangkan slice jika perlu, dan mengembalikan nilai slice yang diperbarui: + +---- +func AppendByte(slice []byte, data ...byte) []byte { + m := len(slice) + n := m + len(data) + if n > cap(slice) { // jika perlu, alokasi ulang. + // Buat alokasi dua kali lebih besar dari yang dibutuhkan, + // untuk penambahan nantinya. + newSlice := make([]byte, (n+1)*2) + copy(newSlice, slice) + slice = newSlice + } + slice = slice[0:n] + copy(slice[m:n], data) + return slice +} +---- + +Kita gunakan fungsi `AppendByte` seperti berikut: + +---- +p := []byte{2, 3, 5} +p = AppendByte(p, 7, 11, 13) +// p == []byte{2, 3, 5, 7, 11, 13} +---- + +Fungsi seperti `AppendByte` berguna karena memberikan kontrol sepenuhnya +dalam mengembangkan isi dari slice. +Bergantung pada karakteristik program, fungsi tersebut bisa saja +mengalokasikan potongan yang lebih kecil atau besar, atau mengatur batas atas +dari ukuran realokasi. + +Namun kebanyakan program tidak perlu kontrol sepenuhnya, sehingga Go +menyediakan fungsi bawaan `append` yang berguna untuk tujuan umum; +fungsi `append` memiliki penanda + +---- +func append(s []T, x ...T) []T +---- + +Fungsi `append` menambahkan elemen-elemen `x` ke akhir dari slice `s`, dan +mengembangkan ukuran slice jika kapasitas lebih besar dibutuhkan. + +---- +a := make([]int, 1) +// a == []int{0} +a = append(a, 1, 2, 3) +// a == []int{0, 1, 2, 3} +---- + +Untuk menambahkan slice ke slice lainnya, gunakan ... untuk memperluas +argumen kedua menjadi sebuah daftar argumen. + +---- +a := []string{"John", "Paul"} +b := []string{"George", "Ringo", "Pete"} +a = append(a, b...) // sama dengan "append(a, b[0], b[1], b[2])" +// a == []string{"John", "Paul", "George", "Ringo", "Pete"} +---- + +Secara nilai kosong dari slice (`nil`) sifatnya seperti slice dengan panjang +nol, kita dapat mendeklarasikan sebuah variabel slice dan kemudian +menambahkan elemen-elemen dalam sebuah pengulangan: + +---- +// Filter mengembalikan sebuah slice baru yang menyimpan hanya elemen-elemen +// dari s yang memenuhi fungsi fn(). +func Filter(s []int, fn func(int) bool) []int { + var p []int // == nil + for _, v := range s { + if fn(v) { + p = append(p, v) + } + } + return p +} +---- + + +== Kesalahan yang umum + +Seperti yang disebutkan sebelumnya, memotong sebuah slice tidak menyalin array +di belakangnya. +Array yang utuh tetap tersimpan dalam memori sampai tidak ada lagi yang +memakainya. +Terkadang hal ini bisa membuat program menyimpan semua data di dalam memori +saat hanya sebagian kecil dari slice yang dibutuhkan. + +Sebagai contohnya, fungsi `FindDigits` berikut memuat sebuah berkas ke dalam +memori dan mencari seurutan digit numerik yang pertama, dan mengembalikan +urutan tersebut sebagai sebuah slice yang baru. + +---- +var digitRegexp = regexp.MustCompile("[0-9]+") + +func FindDigits(filename string) []byte { + b, _ := ioutil.ReadFile(filename) + return digitRegexp.Find(b) +} +---- + +Kode di atas berjalan seperti yang tertulis, namun `[]byte` yang dikembalikan +menunjuk ke array yang berisi seluruh berkas. +Karena slice mengacu ke array aslinya, selama slice tersebut masih digunakan +maka _garbage collector_ tidak dapat menghapus array; +beberapa byte yang terpakai dari berkas menahan seluruh isi berkas di dalam +memori. + +Untuk memperbaiki permasalahan ini kita dapat menyalin data yang perlu saja ke +slice yang baru sebelum dikembalikan: + +---- +func CopyDigits(filename string) []byte { + b, _ := ioutil.ReadFile(filename) + b = digitRegexp.Find(b) + c := make([]byte, len(b)) + copy(c, b) + return c +} +---- + +Versi lebih ringkas dari fungsi di atas dapat dibangun menggunakan `append`. +Cara ini adalah latihan bagi pembaca. + + +== Bacaan Lebih Lanjut + +link:/doc/effective_go.html[Efektif Go] +berisi perlakuan lebih dalam dari +link:/doc/effective_go.html#slices[slice] +dan +link:/doc/effective_go.html#arrays[array], +dan +link:/ref/spec/index.html[spesifikasi bahasa] +Go mendefinisikan +link:/ref/spec/index.html#Slice_types[slice] +dan +link:/ref/spec/index.html#Appending_and_copying_slices[fungsi-fungsi] +link:/ref/spec/index.html#Making_slices_maps_and_channels[pembantu] +link:/ref/spec/index.html#Length_and_capacity[yang berhubungan] +dengan slice. diff --git a/_content/blog/survey2019/index.adoc b/_content/blog/survey2019/index.adoc index 90ed61b..ec5be54 100644 --- a/_content/blog/survey2019/index.adoc +++ b/_content/blog/survey2019/index.adoc @@ -8,7 +8,7 @@ Sejak tahun 2016, ribuan Gopher di seluruh dunia telah membantu proyek Go dengan membagikan pemikiran mereka lewat Survei Pengembang Go. Umpan balik Anda telah berperan penting dalam mengarahkan bahasa, ekosistem, dan komunitas kita ini; termasuk -https://about.sourcegraph.com/go/gophercon-2019-go-pls-stop-breaking-my-editor[server bahasa `gopls`^], +https://www.youtube.com/watch?v=EFJfdWzBHwE[server bahasa `gopls`^], https://go.dev/blog/go1.13-errors[mekanisme penanganan eror^] yang baru, https://go.dev/blog/module-mirror-launch[modul _mirror_^], dan banyak hal lainnya sejak diff --git a/_content/blog/third-party-libraries-goprotobuf-and/index.adoc b/_content/blog/third-party-libraries-goprotobuf-and/index.adoc index 3fe3b50..aa1c827 100644 --- a/_content/blog/third-party-libraries-goprotobuf-and/index.adoc +++ b/_content/blog/third-party-libraries-goprotobuf-and/index.adoc @@ -1,9 +1,9 @@ = Pustaka pihak-ketiga: goprotobuf dan lainnya :author: Andrew Gerrand -:date: 20 April 2010 +:revdate: 20 April 2010 -Pada tanggal 24 Maret, Rob Pike mengumumkan +Pada tanggal 24 Maret 2010, Rob Pike mengumumkan https://code.google.com/p/goprotobuf/[goprotobuf^], pustaka Go untuk format pertukaran data menggunakan https://code.google.com/apis/protocolbuffers/docs/overview.html[Protocol Buffers^] @@ -40,7 +40,7 @@ https://code.google.com/p/goprotobuf/source/browse/README[README^] dari proyek tersebut. Ini adalah salah satu dari daftar pustaka pihak-ketiga dari -https://godashboard.appspot.com/package[proyek-proyek Go^] +https://pkg.go.dev/[proyek-proyek Go^] yang terus berkembang. Sejak diluncurkannya goprotobuf, Go _binding_ untuk X telah dipindahkan ke proyek diff --git a/_content/cmd/go/index.adoc b/_content/cmd/go/index.adoc index 998bcbd..c99ed49 100644 --- a/_content/cmd/go/index.adoc +++ b/_content/cmd/go/index.adoc @@ -2293,7 +2293,7 @@ kode, namun paket-paket yang baru selalu diunduh ke direktori pertama dalam daftar tersebut. Lihat -link:/doc/code.html +link:/doc/code/[Cara Menulis Kode Go] sebagai contohnya. [#hdr-GOPATH_and_Modules] @@ -2636,8 +2636,8 @@ Jika halaman kembalian berisi tag `meta` berikut ---- -perkakas go akan memverifikasi bahwa https://example.og/?go-get=1 berisi tag -`meta` yang sama dan kemudian mengeksekusi +perkakas go akan memverifikasi bahwa "\https://example.org/?go-get=1" berisi +tag `meta` yang sama dan kemudian mengeksekusi git clone https://code.org/r/p/exproj @@ -2662,7 +2662,7 @@ Variasi tersebut menggunakan "mod" sebagai nilai dalam `vcs`, seperti berikut: ---- Tag tersebut berarti untuk mengunduh modul dengan path yang diawali dengan -`example.org` dari proksi modul lewat URL https://code.org/moduleproxy. +`example.org` dari proksi modul lewat URL \https://code.org/moduleproxy . Lihat https://go.dev/ref/mod#goproxy-protocol untuk detail tentang protokol proksi. diff --git a/_content/doc/articles/go_command.adoc b/_content/doc/articles/go_command.adoc index 89dd11d..1b75981 100644 --- a/_content/doc/articles/go_command.adoc +++ b/_content/doc/articles/go_command.adoc @@ -94,7 +94,7 @@ penting yang telah terbentuk. Pertama, path impor diturunkan dari URL sumber kode. Untuk Bitbucket, Github, Google Code, dan Launchpad, direktori utama dari -repositori diidentifikasi oleh URL repositori, tanpa prefiks "https://". +repositori diidentifikasi oleh URL repositori, tanpa prefiks "\https://". Sub-sub direktori diberi nama sesuai dengan path. Sebagai contohnya, contoh program Go dapat diambil dengan menjalankan @@ -165,7 +165,7 @@ Seperti yang telah dijelaskan di atas, nilai standar dari `$GOPATH` pada Unix adalah `$HOME/go`. Kita akan menyimpan program kita di sana. Untuk menggunakan lokasi yang berbeda anda dapat menset `$GOPATH`; -link:/doc/code.html[Cara Menulis Kode Go^] +link:/doc/code/[Cara Menulis Kode Go^] untuk lebih jelasnya. Pertama kita tambahkan beberapa sumber kode. @@ -276,6 +276,6 @@ get" tanpa perlu mendapatkan dan membangun perkakas tambahan. == Informasi lebih lanjut Untuk informasi lebih lanjut, baca -link:/doc/code.html[Cara Menulis Kode Go^] +link:/doc/code/[Cara Menulis Kode Go^] dan lihat link:/cmd/go/[perintah go^]. diff --git a/_content/doc/articles/wiki/index.adoc b/_content/doc/articles/wiki/index.adoc index d88c17b..9b1a6f9 100644 --- a/_content/doc/articles/wiki/index.adoc +++ b/_content/doc/articles/wiki/index.adoc @@ -318,7 +318,7 @@ $ ./wiki menjalakan program.) Saat peladen web telah berjalan, membuka -http://localhost:8080/view/test[localhost:8080/view/test^] +\http://localhost:8080/view/test akan menampilkan sebuah halaman berjudul "test" berisi kata "Hello world". @@ -484,7 +484,7 @@ link:/doc/articles/wiki/part3.go[Klik di sini untuk melihat kode yang telah kita == Menangani halaman yang tidak ada Apa yang terjadi bila kita mengunjungi -http://localhost:8080/view/HalamanYangTidakAda[`/view/HalamanYangTidakAda`^]? +\http://localhost:8080/view/HalamanYangTidakAda ? Kita akan melihat sebuah halaman yang berisi HTML. Hal ini karena kita mengindahkan error dari `loadPage` dan melanjutkan mencoba mengisi templat dengan data yang tidak ada. @@ -833,7 +833,7 @@ $ ./wiki ---- Membuka halaman berikut -http://localhost:8080/view/ANewPage[localhost:8080/view/ANewPage^] +\http://localhost:8080/view/ANewPage seharusnya memperlihatkan halaman penyuntingan. Anda seharusnya bisa menginput teks, klik 'Save', dan dialihkan ke halaman yang baru dibuat. diff --git a/_content/doc/cmd/index.adoc b/_content/doc/cmd/index.adoc index b985414..4f7ded2 100644 --- a/_content/doc/cmd/index.adoc +++ b/_content/doc/cmd/index.adoc @@ -2,7 +2,7 @@ Ada sekumpulan program untuk membangun dan memproses sumber kode Go. Program-program tersebut tidak dijalankan secara langsung, namun dipanggil -oleh program link:/doc/cmd/go/[go]. +oleh program link:/cmd/go/[go]. Cara paling umum untuk menjalankan program tersebut yaitu sebagai sub-perintah dari program go, misalnya `go fmt`. diff --git a/_content/doc/database/index.adoc b/_content/doc/database/index.adoc index 975cfb6..352d233 100644 --- a/_content/doc/database/index.adoc +++ b/_content/doc/database/index.adoc @@ -59,9 +59,9 @@ perintah SQL seperti `INSERT`, `UPDATE`, atau `DELETE`. Lebih lanjut, lihat bagian berikut: -* link:/doc/database/change-data/[Mengeksekusi perintah SQL yang tidak +* https://go.dev/doc/database/change-data/[Mengeksekusi perintah SQL yang tidak mengembalikan data] -* link:/doc/database/querying/[Mengueri data] +* https://go.dev/doc/database/querying/[Mengueri data] [#transactions] === Transaksi @@ -73,7 +73,7 @@ diakhiri dengan sebuah _commit_, untuk menyimpan semua perubahan secara _atomic_, atau sebuah _rollback_, untuk mengabaikan semua. Lebih lanjut tentang transaksi, lihat -link:/doc/database/execute-transactions/[Mengeksekusi transaksi]. +https://go.dev/doc/database/execute-transactions/[Mengeksekusi transaksi]. [#query_cancellation] === Pembatalan kueri @@ -90,7 +90,7 @@ pembatalan dari aplikasi ke fungsi yang mengeksekusi perintah SQL, memastikan bahwa sumber yang terpakai dibebaskan bila tidak dibutuhkan lagi. Lebih lanjut, lihat -link:/doc/database/cancel-operations/[Pembatalan operasi] +https://go.dev/doc/database/cancel-operations/[Pembatalan operasi] [#connection_pool] === Mengatur _pool_ koneksi @@ -100,12 +100,12 @@ membuat dan menutup koneksi berdasarkan kebutuhan kode. Penggunaan `sql.DB` adalah cara paling umum untuk mengakses basis-data pada Go. Lebih lanjut, lihat -link:/doc/database/open-handle/[Membuat koneksi basis-data]. +https://go.dev/doc/database/open-handle/[Membuat koneksi basis-data]. Paket `database/sql` mengatur _pool_ koneksi untuk Anda. Namun, untuk kebutuhan tingkat lanjut, Anda dapat mengatur _pool_ koneksi seperti yang dijelaskan dalam -link:/doc/database/manage-connections#connection_pool_properties[Mengatur +https://go.dev/doc/database/manage-connections#connection_pool_properties[Mengatur properti _pool_ koneksi]. Untuk operasi-operasi yang mana Anda membutuhkan satu koneksi, @@ -120,10 +120,10 @@ Sebagai contoh, kode Anda bisa saja butuh: mengikutkan logika yang berisi semantik transaksi sendiri. Mencampurkan fungsi transaksi paket `sql` dengan perintah transaksi SQL adalah praktik yang tidak bagus, seperti yang dijelaskan dalam - link:/doc/database/execute-transaction/[Mengeksekusi transaksi]. + https://go.dev/doc/database/execute-transactions[Mengeksekusi transaksi]. * Melakukan operasi yang mengunci kueri yang membuat tabel-tabel sementara. Lebih lanjut, lihat -link:/doc/database/manage-connections#dedicated_connections[Menggunakan +https://go.dev/doc/database/manage-connections#dedicated_connections[Menggunakan koneksi tunggal]. diff --git a/_content/doc/effective_go.adoc b/_content/doc/effective_go.adoc index 275100c..64371f9 100644 --- a/_content/doc/effective_go.adoc +++ b/_content/doc/effective_go.adoc @@ -6,7 +6,7 @@ :en-cmd-go-show: https://go.dev/cmd/go/#hdr-Show_documentation_for_package_or_symbol :en-blog-concurrency: https://go.dev/blog/2013/01/concurrency-is-not-parallelism.html :id-tour: https://tour.golang-id.org -:id-doc-code: link:/doc/code.html +:id-doc-code: link:/doc/code/ [#introduction] == Pendahuluan @@ -3563,13 +3563,13 @@ untuk paket `template` untuk penjelasan yang lebih lengkap. Untuk mencoba kode di atas, simpanlah ke dalam sebuah berkas berekstensi `.go` dalam sebuah -link:/doc/code.html#Workspaces[ruang kerja^] dan jalankan, +link:/doc/code/[ruang kerja^] dan jalankan, ---- $ go run . ---- -kemudian buka peramban web pada halaman `http://127.0.0.1:1718`. +kemudian buka peramban web pada halaman `\http://127.0.0.1:1718`. Dan dengan ini kita memiliki sebuah web server yang berguna, dengan sejumlah baris kode ditambah teks HTML. diff --git a/_content/doc/faq/index.adoc b/_content/doc/faq/index.adoc index ff8cba8..7e0ec52 100644 --- a/_content/doc/faq/index.adoc +++ b/_content/doc/faq/index.adoc @@ -1195,7 +1195,7 @@ https://go.dev/[golang.org^]. Instansi dari `godoc` bisa di-konfigurasi untuk menyediakan analisis interaktif yang kaya dari simbol dalam program; detail-nya ada dalam daftar -https://go.dev/lib/godoc/analysis/help.html[berikut^]. +https://htmlpreview.github.io/?https://github.com/golang/tools/blob/v0.36.0/godoc/static/analysis/help.html[berikut^] Untuk mengakses dokumentasi dari baris perintah, perkakas link:/cmd/go/[go^] @@ -1241,7 +1241,7 @@ Jika anda ingin membuat perubahan yang signifikan, mohon didiskusikan terlebih dahulu di milis sebelum memulai. Lihat dokumentasi -https://go.dev/doc/contribute.html[Berkontribusi pada proyek Go^] +https://go.dev/doc/contribute[Berkontribusi pada proyek Go^] untuk informasi lebih lanjut. //}}} @@ -1869,7 +1869,7 @@ Program tersebut akan mencari fungsi yang berawalan `Test`, membuat binari tes, dan menjalankannya. Lihat dokumentasi -link:/doc/code.html[Cara Menulis Kode Go^], +link:/doc/code/[Cara Menulis Kode Go^], paket https://pkg.go.dev/testing[testing^] dan perintah diff --git a/_content/doc/gdb/index.adoc b/_content/doc/gdb/index.adoc index ea79958..0bef45e 100644 --- a/_content/doc/gdb/index.adoc +++ b/_content/doc/gdb/index.adoc @@ -55,8 +55,7 @@ build -gcflags=all="-N -l"`. Jika Anda ingin menggunakan gdb untuk menginspeksi sebuah _core dump_, Anda dapat memicu _dump_ pada saat program _crash_, pada sistem yang membolehkan, dengan menset `GOTRACEBACK=crash` di lingkungan sistem (lihat -http://127.0.0.1:6061/pkg/runtime/#hdr-Environment_Variables[dokumentasi paket -`runtime`] +https://pkg.go.dev/runtime/#hdr-Environment_Variables[dokumentasi paket `runtime`] untuk informasi lebih lanjut). [#Common_Operations] diff --git a/_content/doc/install/gccgo/index.adoc b/_content/doc/install/gccgo/index.adoc index e557299..60f4a1e 100644 --- a/_content/doc/install/gccgo/index.adoc +++ b/_content/doc/install/gccgo/index.adoc @@ -73,7 +73,7 @@ Perlu diketahui, walaupun gcc.gnu.org adalah salah satu cara umum untuk mendapatkan kode sumber untuk antar-muka Go, repositori itu bukanlah sumber utama sebenarnya. Jika Anda ingin berkontribusi pada antar-muka _compiler_ Go, lihatlah halaman -link:/doc/gccgo_contribute.html[Berkontribusi pada gccgo^]. +https://go.dev/doc/gccgo_contribute[Berkontribusi pada gccgo^]. [#Building] diff --git a/_content/doc/install/index.adoc b/_content/doc/install/index.adoc index 158cfa4..a62d792 100644 --- a/_content/doc/install/index.adoc +++ b/_content/doc/install/index.adoc @@ -187,7 +187,7 @@ Jika Anda melihat pesan "hello, world" maka instalasi Go Anda berjalan dengan benar. Sebelum bergegas menulis kode Go, mohon baca dokumen tentang -link:/doc/code.html[Cara Menulis Kode Go], +link:/doc/code/[Cara Menulis Kode Go], yang menjelaskan beberapa konsep utama tentang menggunakan perkakas Go. diff --git a/_content/doc/install/source/index.adoc b/_content/doc/install/source/index.adoc index 63aaacc..747d869 100644 --- a/_content/doc/install/source/index.adoc +++ b/_content/doc/install/source/index.adoc @@ -189,7 +189,7 @@ Lihat bagian tentang <> di bawah. == Pindah ke cabang master (opsional) Jika Anda berniat untuk mengubah kode sumber Go, dan -link:/doc/contribute.html[berkontribusi^] +https://go.dev/doc/contribute[berkontribusi^] ke proyek ini, maka pindahlah dari cabang rilis ke cabang `master` (cabang pengembangan). Jika bukan demikian, lewati langkah ini. @@ -278,7 +278,7 @@ menyediakan *instruksi pengaturan yang penting* untuk menggunakan perkakas Go. == Pasang perkakas tambahan Sumber kode untuk beberapa perkakas Go tambahan (termasuk -link:/cmd/godoc/[godoc^]) +https://pkg.go.dev/golang.org/x/tools/cmd/godoc[godoc^]) disimpan di https://pkg.go.dev/golang.org/x/tools[repositori tools^]. Untuk memasang salah satu perkakas tersebut (misalnya `godoc`): diff --git a/_content/doc/modules/managing-dependencies/index.adoc b/_content/doc/modules/managing-dependencies/index.adoc index e01f60c..f55da17 100644 --- a/_content/doc/modules/managing-dependencies/index.adoc +++ b/_content/doc/modules/managing-dependencies/index.adoc @@ -1,4 +1,6 @@ = Manajemen dependensi +:sectanchors: +:toc: Bila kode Anda menggunakan paket-paket eksternal, paket tersebut (yang didistribusi dalam modul) menjadi dependensi. @@ -156,7 +158,7 @@ yang diunduh, terutama untuk pengembang lain yang bekerja dalam proyek Anda. Masukan berkas go.mod dan go.sum ke dalam repositori berikut dengan kode Anda. Lihat -link:/doc/modules/gomod-ref/[referensi go.mod^] +https://go.dev/doc/modules/gomod-ref[referensi go.mod^] untuk informasi lebih lanjut. [#naming_module] diff --git a/_content/doc/tutorial/call-module-code/index.adoc b/_content/doc/tutorial/call-module-code/index.adoc index 9ac7c09..e04bb21 100644 --- a/_content/doc/tutorial/call-module-code/index.adoc +++ b/_content/doc/tutorial/call-module-code/index.adoc @@ -148,7 +148,7 @@ require example.com/greetings v0.0.0-00010101000000-000000000000 Perintah tersebut menemukan modul lokal dalam direktori "greetings", kemudian menambahkan -link:/doc/modules/gomod-ref/#require[direktif "require"] +https://go.dev/doc/modules/gomod-ref/#require[direktif `require`^] untuk menspesifikasikan bahwa "example.com/hello" membutuhkan "example.com/greetings". Kita memakai dependensi ini saat kita mengimpor paket "greetings" dalam @@ -167,8 +167,7 @@ require example.com/greetings v1.1.0 ---- Untuk informasi lebih lanjut tentang angka versi, lihat -link:/doc/modules/version-numbers/[Angka versi pada modul]. --- +https://go.dev/doc/modules/version-numbers[Angka versi pada modul^]. -- . Pada _terminal_, masih di dalam direktori "hello", jalankan kode Anda untuk diff --git a/_content/doc/tutorial/create-module/index.adoc b/_content/doc/tutorial/create-module/index.adoc index 995a559..e6c18e8 100644 --- a/_content/doc/tutorial/create-module/index.adoc +++ b/_content/doc/tutorial/create-module/index.adoc @@ -61,7 +61,7 @@ Contohnya, kita bisa membuat sebuah modul untuk paket-paket yang memiliki fungsi-fungsi yang melakukan analisis finansial sehingga orang lain yang membuat aplikasi finansial dapat menggunakan karya kita. Untuk informasi lebih lanjut tentang pengembangan dengan modul, lihat -link:/doc/modules/developing/[Membangun dan menerbitkan modul^]. +https://go.dev/doc/modules/developing[Membangun dan menerbitkan modul^]. Kode Go dikelompokkan ke dalam paket-paket, dan paket-paket dikelompokkan ke dalam modul. @@ -103,7 +103,7 @@ cd greetings -- . Buatlah Go modul menggunakan perintah - link:/ref/mod/#go-mod-init[`go mod init`^] + https://go.dev/ref/mod#go-mod-init[`go mod init`^] + -- Jalankan perintah "`go mod init`", dengan memberikan parameter path modul -- diff --git a/_content/doc/tutorial/database-access/index.adoc b/_content/doc/tutorial/database-access/index.adoc index ebe38f4..fbba23c 100644 --- a/_content/doc/tutorial/database-access/index.adoc +++ b/_content/doc/tutorial/database-access/index.adoc @@ -720,7 +720,7 @@ Rekomendasi topik-topik selanjutnya: dan link:/doc/code/[Menulis kode Go]. -* https://tur.golang-id.org/welcome/1[Tur Go] +* https://tour.golang-id.org/welcome/1[Tur Go] adalah pengenalan langkah demi langkah dari fundamental Go. diff --git a/_content/doc/tutorial/getting-started/index.adoc b/_content/doc/tutorial/getting-started/index.adoc index a3f7b33..0cb46ea 100644 --- a/_content/doc/tutorial/getting-started/index.adoc +++ b/_content/doc/tutorial/getting-started/index.adoc @@ -236,4 +236,4 @@ Secara bawaan, Go akan mengunduh versi yang paling terbaru -- v1.5.2. Lewat pengenalan singkat ini, kita telah memasang Go dan mempelajari beberapa dasar-dasarnya. Untuk melanjutkan menulis kode dengan tutorial lain, lihatlah -link:/doc/tutorial/create-module.html[Membuat modul Go]. +link:/doc/tutorial/create-module/[Membuat modul Go]. diff --git a/_content/doc/tutorial/module-conclusion/index.adoc b/_content/doc/tutorial/module-conclusion/index.adoc index dceb5d1..aa8fae6 100644 --- a/_content/doc/tutorial/module-conclusion/index.adoc +++ b/_content/doc/tutorial/module-conclusion/index.adoc @@ -11,7 +11,7 @@ Untuk informasi lebih lanjut tentang mengatur dependensi dalam kode, lihat lah link:/doc/modules/managing-dependencies/[Mengatur dependensi^]. Untuk informasi lebih lanjut tentang pengembangan modul untuk dapat digunakan oleh orang lain, lihat -link:/doc/modules/developing/[Mengembangkan dan menerbitkan modul^]. +https://go.dev/doc/modules/developing[Mengembangkan dan menerbitkan modul^]. Untuk pendahuluan tentang fitur-fitur dari bahasa Go, coba lah https://tour.golang-id.org/welcome/1[Tur Bahasa Go^]. diff --git a/_content/doc/tutorial/workspaces/index.adoc b/_content/doc/tutorial/workspaces/index.adoc index ce6bed4..8798de5 100644 --- a/_content/doc/tutorial/workspaces/index.adoc +++ b/_content/doc/tutorial/workspaces/index.adoc @@ -274,7 +274,7 @@ yang ditentukan oleh berkas `go.work`, dan dengan cara yang sama menemukan impor `golang.org/x/example` lewat berkas `go.work`. Berkas `go.work` dapat digunakan sebagai pengganti direktif -link:/ref/mod#go-mod-file-replace[`replace`^] +https://go.dev/ref/mod#go-mod-file-replace[`replace`^] untuk bekerja dengan banyak modul. Secara dua modul tersebut berada dalam ruang kerja yang sama, akan mudah untuk @@ -287,7 +287,7 @@ Sekarang, untuk merilis modul `hello` kita harus merilis module Hal ini biasanya dilakukan dengan membuat tag pada komit tertentu pada modul repositori. Lihat -link:/doc/modules/release-workflow/[dokumentasi alur kerja rilis modul^]. +https://go.dev/doc/modules/release-workflow[dokumentasi alur kerja rilis modul^]. Saat modul telah dirilis, kita dapat meningkatkan versi yang dibutuhkan pada dalam `hello/go.mod`: @@ -328,6 +328,6 @@ modul dalam _workspace_. -- Lihat -link:/ref/mod#workspaces[Workspace^] +https://go.dev/ref/mod#workspaces[Workspace^] dalam Referensi Go Modul untuk lebih rinci tentang ruang kerja dan berkas `go.work`. -- cgit v1.3