Mengenal Package io dan bufio di Golang


Selamat datang di tutorial keempat dari seri Golang Standard Library! Pada tutorial ini, kita akan membahas dua package penting dalam Golang, yaitu io
dan bufio
. Kedua package ini sangat berguna untuk operasi input/output (I/O) yang efisien dan mudah dikelola. Mari kita mulai!
Package io
Package io
menyediakan berbagai interface dan fungsi dasar untuk operasi I/O. Ini adalah dasar dari banyak operasi I/O di Golang. Berikut adalah beberapa konsep utama dalam package io
:
1. Interface Reader
dan Writer
Reader: Interface ini digunakan untuk membaca data dari sumber I/O. Definisi dasarnya adalah:
type Reader interface { Read(p []byte) (n int, err error) }
Contoh penggunaan:
package main import ( "fmt" "io" "strings" ) func main() { // Membuat Reader dari string "Hello, World!" r := strings.NewReader("Hello, World!") // Membuat slice byte untuk menyimpan data yang dibaca p := make([]byte, 5) // Membaca data dari Reader ke dalam slice p n, err := r.Read(p) // Memeriksa apakah sudah mencapai akhir file (EOF) if err == io.EOF { fmt.Println("End of file") } else if err != nil { fmt.Println("Error:", err) } // Mencetak jumlah byte yang dibaca dan isi dari slice p fmt.Printf("Read %d bytes: %s\n", n, p) }
Penjelasan Kode:
strings.NewReader("Hello, World!")
membuat sebuahReader
dari string yang diberikan.make([]byte, 5)
membuat slice byte dengan panjang 5 untuk menyimpan data yang dibaca.r.Read
(p)
membaca data dariReader
ke dalam slicep
. Fungsi ini mengembalikan jumlah byte yang berhasil dibaca (n
) dan error jika ada (err
).Jika
err
adalahio.EOF
, berarti sudah mencapai akhir data. Jika tidak, kita cek apakah ada error lain.fmt.Printf
mencetak jumlah byte yang dibaca dan isi dari slicep
.
Output:
Read 5 bytes: Hello
Writer: Interface ini digunakan untuk menulis data ke tujuan I/O. Definisi dasarnya adalah:
type Writer interface { Write(p []byte) (n int, err error) }
Contoh penggunaan:
package main import ( "fmt" "io" "os" ) func main() { // Menggunakan os.Stdout sebagai Writer w := os.Stdout // Menulis string ke Writer menggunakan io.WriteString n, err := io.WriteString(w, "Hello, World!\n") // Memeriksa apakah ada error saat menulis if err != nil { fmt.Println("Error:", err) } // Mencetak jumlah byte yang berhasil ditulis fmt.Printf("Wrote %d bytes\n", n) }
Penjelasan Kode:
os.Stdout
adalahWriter
yang merepresentasikan output standar (layar).io.WriteString(w, "Hello, World!\n")
menulis string keWriter
. Fungsi ini mengembalikan jumlah byte yang berhasil ditulis (n
) dan error jika ada (err
).Jika ada error saat menulis, kita cetak error tersebut.
fmt.Printf
mencetak jumlah byte yang berhasil ditulis.
Output:
Hello, World!
Wrote 14 bytes
2. Fungsi Bantuan
Package io
juga menyediakan beberapa fungsi bantuan seperti io.Copy
, io.ReadAll
, dan io.WriteString
yang memudahkan operasi I/O.
package main import ( "fmt" "io" "os" ) func main() { fmt.Println("Ketik sesuatu, lalu tekan Ctrl+D (Linux/macOS) atau Ctrl+Z (Windows) untuk selesai:") // Buka (atau buat) file output.txt file, err := os.Create("output.txt") if err != nil { fmt.Println("Gagal membuat file:", err) return } defer file.Close() // Salin semua input dari stdin ke file _, err = io.Copy(file, os.Stdin) if err != nil { fmt.Println("Gagal menulis ke file:", err) return } fmt.Println("Isi berhasil disimpan ke output.txt") }
Package bufio
Package bufio
membangun di atas io
dengan menyediakan buffer untuk operasi I/O yang lebih efisien. Buffer membantu dalam mengurangi jumlah operasi I/O yang sebenarnya dilakukan, yang bisa sangat lambat.
1. bufio.Reader
bufio.Reader
membungkus io.Reader
untuk menyediakan buffer. Ini memungkinkan pembacaan data dalam potongan-potongan yang lebih besar, yang lebih efisien.
Contoh penggunaan:
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
// Membuat Reader dari string
r := strings.NewReader("Hello\nWorld!")
// Membungkus Reader dengan bufio.Reader
br := bufio.NewReader(r)
// Membaca hingga karakter '\n'
line1, err := br.ReadString('\n')
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println(line1)
// Membaca hingga karakter '!'
line2, err := br.ReadString('!')
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println(line2)
}
Penjelasan Kode:
strings.NewReader("Hello\nWorld!")
membuatReader
dari string yang berisi dua baris.bufio.NewReader(r)
membungkusReader
denganbufio.Reader
untuk menambahkan buffer.br.ReadString('\n')
membaca data daribufio.Reader
hingga menemukan karakter '\n' (newline). Fungsi ini mengembalikan string yang dibaca dan error jika ada.Jika ada error saat membaca, kita cetak error tersebut.
fmt.Println
mencetak hasil pembacaan.
Output:
Hello
World!
2. bufio.Writer
bufio.Writer
membungkus io.Writer
untuk menyediakan buffer. Ini memungkinkan penulisan data dalam buffer sebelum ditulis ke tujuan akhir, yang bisa meningkatkan performa.
Contoh penggunaan:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// Membuat Writer dari os.Stdout
w := bufio.NewWriter(os.Stdout)
// Menulis data ke buffer
fmt.Fprint(w, "Hello, ")
fmt.Fprint(w, "World!")
// Memastikan semua data ditulis ke tujuan akhir
w.Flush()
}
Penjelasan Kode:
bufio.NewWriter(os.Stdout)
membuatbufio.Writer
yang membungkusos.Stdout
(output standar).fmt.Fprint(w, "Hello, ")
danfmt.Fprint(w, "World!")
menulis data ke bufferbufio.Writer
.w.Flush()
memastikan semua data yang ada di buffer ditulis ke tujuan akhir (layar dalam kasus ini).
Output:
Hello, World!
3. bufio.Scanner
bufio.Scanner
adalah alat yang sangat berguna untuk membaca input teks secara efisien, terutama untuk membaca file atau input dari pengguna baris demi baris.
Contoh penggunaan:
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
// Data teks yang akan dibaca
data := `Line 1
Line 2
Line 3`
// Membuat Scanner dari Reader
scanner := bufio.NewScanner(strings.NewReader(data))
// Loop untuk membaca setiap baris
for scanner.Scan() {
// Mencetak setiap baris yang dibaca
fmt.Println(scanner.Text())
}
// Memeriksa apakah ada error saat scanning
if err := scanner.Err(); err != nil {
fmt.Println("Error:", err)
}
}
Penjelasan Kode:
data
adalah string yang berisi beberapa baris teks.bufio.NewScanner(strings.NewReader(data))
membuatScanner
dariReader
yang dibuat dari stringdata
.scanner.Scan()
membaca satu baris dari input. Jika berhasil, loop akan berlanjut.scanner.Text()
mengembalikan teks dari baris yang baru saja dibaca.scanner.Err()
memeriksa apakah ada error selama proses scanning.
Output:
Line 1
Line 2
Line 3
Kesimpulan
Package io
dan bufio
adalah bagian penting dari Golang Standard Library yang memudahkan pengelolaan operasi I/O. Dengan memahami dan menggunakan interface Reader
dan Writer
serta buffer dari bufio
, Anda dapat menulis kode I/O yang lebih efisien dan mudah dikelola. Semoga tutorial ini membantu Anda dalam memahami dasar-dasar penggunaan kedua package ini. Selamat mencoba dan terus belajar!
Subscribe to my newsletter
Read articles from Ajitama Dev directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
