io va bufio
io — Go dagi oqimlarning (stream) asosi. Fayl, tarmoq, xotira — hammasi bir xil ikki interfeys orqali ishlaydi. bufio esa buferlash bilan o’qish/yozishni tezlashtiradi.
io.Reader va io.Writer
Butun Go standart kutubxonasi ikki kichik interfeysga tayanadi: Reader (bittagina Read metodi) va Writer (bittagina Write metodi). Shu tufayli faylga yozadigan kod tarmoqqa ham, xotiraga ham xuddi shunday yozadi.
package main
import (
"fmt"
"io"
"strings"
)
func main() {
var r io.Reader = strings.NewReader("salom dunyo")
buf := make([]byte, 5)
n, _ := r.Read(buf)
fmt.Printf("%d bayt: %q\n", n, buf[:n])
}$ go run reader.go
5 bayt: "salom"Takeaway: strings.NewReader, fayl, resp.Body — hammasi io.Reader; kodingizni bitta turga bog’lamang.
Manba / batafsil: pkg.go.dev/io#Reader
io.Copy
io.Copy Reader dan Writer ga butun ma’lumotni ko’chiradi — o’zingiz sikl yozmasdan. Fayl nusxalash, javobni ekranga chiqarish uchun ideal.
package main
import (
"io"
"os"
"strings"
)
func main() {
src := strings.NewReader("bu matn to'g'ridan-to'g'ri ekranga ketadi\n")
io.Copy(os.Stdout, src)
}$ go run copy.go
bu matn to'g'ridan-to'g'ri ekranga ketadiTakeaway: io.Copy(dst, src) — oqimni oqimga ulashning eng qisqa yo’li.
Manba / batafsil: pkg.go.dev/io#Copy
bufio.Scanner — qatorma-qator o’qish
Matnni qatorlarga bo’lib o’qishning eng qulay yo’li — bufio.Scanner. Scan() har chaqiruvda keyingi qatorga o’tadi, Text() esa joriy qatorni beradi.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
input := "bir\nikki\nuch"
scanner := bufio.NewScanner(strings.NewReader(input))
n := 0
for scanner.Scan() {
n++
fmt.Printf("%d: %s\n", n, scanner.Text())
}
}$ go run scanner.go
1: bir
2: ikki
3: uchTakeaway: os.Stdin ni ham shu tarzda o’qib, foydalanuvchidan qator olasiz.
Manba / batafsil: pkg.go.dev/bufio#Scanner
bufio.NewReader
Har bir Read chaqiruvi tizim chaqiruvi (syscall) bo’lishi mumkin — sekin. bufio.NewReader ma’lumotni katta bo’laklarda o’qib buferga saqlaydi. ReadString ajratuvchigacha (masalan \n) o’qiydi.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("Ali,27,Toshkent\n"))
line, _ := r.ReadString('\n')
fmt.Printf("%q\n", line)
}$ go run bufreader.go
"Ali,27,Toshkent\n"Takeaway: Scanner — oddiy qatorlarga, NewReader.ReadString — ajratuvchini saqlab qolish kerak bo’lganda.
Manba / batafsil: pkg.go.dev/bufio#NewReader
Keyingi qismda os va flag — fayllar va CLI argumentlari bilan ishlashni ko’ramiz.