Back to Blog
Go Language

Mengenal Package io dan bufio di Golang

23 April 20255 min read
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:

go
type Reader interface {
        Read(p []byte) (n int, err error)
    }

Contoh penggunaan:

go
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 sebuah Reader dari string yang diberikan.

* make([]byte, 5) membuat slice byte dengan panjang 5 untuk menyimpan data yang dibaca.

* [r.Read](http://r.Read)(p) membaca data dari Reader ke dalam slice p. Fungsi ini mengembalikan jumlah byte yang berhasil dibaca (n) dan error jika ada (err).

* Jika err adalah io.EOF, berarti sudah mencapai akhir data. Jika tidak, kita cek apakah ada error lain.

* fmt.Printf mencetak jumlah byte yang dibaca dan isi dari slice p.

Output:

plaintext
Read 5 bytes: Hello

* Writer: Interface ini digunakan untuk menulis data ke tujuan I/O. Definisi dasarnya adalah:

go
type Writer interface {
        Write(p []byte) (n int, err error)
    }

Contoh penggunaan:

go
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 adalah Writer yang merepresentasikan output standar (layar).

* io.WriteString(w, "Hello, World!\n") menulis string ke Writer. 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:

plaintext
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.

* ```go

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")

}

text
## 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)

}

text
**Penjelasan Kode:**

* `strings.NewReader("Hello\nWorld!")` membuat `Reader` dari string yang berisi dua baris.
    
* `bufio.NewReader(r)` membungkus `Reader` dengan `bufio.Reader` untuk menambahkan buffer.
    
* `br.ReadString('\n')` membaca data dari `bufio.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!

text
### 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()

}

text
**Penjelasan Kode:**

* `bufio.NewWriter(os.Stdout)` membuat `bufio.Writer` yang membungkus `os.Stdout` (output standar).
    
* `fmt.Fprint(w, "Hello, ")` dan `fmt.Fprint(w, "World!")` menulis data ke buffer `bufio.Writer`.
    
* `w.Flush()` memastikan semua data yang ada di buffer ditulis ke tujuan akhir(layar dalam kasus ini).
    

Output:

Hello, World!

text
### 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)

}

}

text
**Penjelasan Kode:**

* `data` adalah string yang berisi beberapa baris teks.
    
* `bufio.NewScanner(strings.NewReader(data))` membuat `Scanner` dari `Reader` yang dibuat dari string `data`.
    
* `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

text
## 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!

Article Series

Golang Standard Library

Lanjutkan membaca seri ini untuk melihat perjalanan lengkapnya.

  1. 1
    Package fmt di Golang
    17 Apr 20253 min read
  2. 2
  3. 3
  4. 4
    Mengenal Package io dan bufio di Golang
    23 Apr 20255 min readCurrent article
  5. 5
    Package testing di Golang
    24 Apr 20252 min read