Go ile /dev/std İşlemleri

Codx

Katılımcı Üye
30 Tem 2017
309
1
Merhabalar, iyi forumlar herkese.

Golang ile stdin, stdout işlemlerinden bahsediyor olacağız.

Unix tabanlı işletim sistemleri herşeyi dosya olarak görür, bizim mouse'umuzu bile.

Her işleminde default olarak 3 standart ve her unix tabanlı işletim sistemlerinde bulunan dosyayı kullanır. Bunlar /dev/stdin, /dev/stdout, /dev/sdterr isimli dosyalardır.

Burada "std" derken bunu standart olarak açabiliriz. Sonuna "in" geldiğinde "standart input", "output", "error" olduğunu söyleyebiliriz.

Go, bunlara erişmek için io.Stdin, io.Stdout, io.Stderr fonksiyonlarını kullanır. Tabi bununla birlikte /dev/stdin, /dev/stdout, /dev/sdterr dosyalarına erişmek için tanımlayıcı değerleri de kullanılabiliyor. (2, 1 ve 0 )

Şimdi teknik bilgiden bahsettikten sonra output vermek için en temelde ne yaptığımızdan bahsedelim.

Bunun için fmt kütüphanesini kullanacağız https://golang.org/pkg/fmt/ adresinde bu kütüphane hakkında detaylı bilgiye ulaşabilirsiniz. fmt input ve output işlemleri için kullanılır.

Benim en sık gördüğüm fmt.Println() ve fmt.Printf() fonksiyonalarıdır. Println() çıktıyı ekrana basar bir alt satıra geçer. Bunun dışında içerisine birkaç değişken verirseniz fmt.Println(x, y, z) gibi, aralarına birer space karakteri koyarak ekrana bastırır yani yapışık olmaz. Sonrasında alt satıra konumlanır. fmt.Printf()'e gelecek olursak Printf() diğer dillerde de olduğu gibi çıktınız üzerinde daha fazla hakimiyet imkanı sunar fakat daha vazla kod yazmanızı gerektirebilir. Fazla derken ekstradan gereksiz iş çıkartmaktan bahsetmiyorum. Bir de fmt.Print() var. Bu fonksiyon çıktıyı direk olarak ekrana basar, başka bir şey yapmaz. fmt.Println()'ın aksine verdiğimiz değişkenleri aralarında boşluk olmadan yazar, direk birleştirir.

Bir de örnek gösterelim.



Çıktısı



Bu fonksiyonların birde fmt.Fprint(), fmt.Fprintln(), fmt.Fprintf() olarak kullanıldığı versiyonları mevcuttur. Bunlar dosyalara yazmak için kullanılıyorlar. Bunu yaparken io.Writer ve io.Reader isimli iki adet interface kullanıyorlar. Bunları şimdi değil sonra kullanıcaz.

Şimdi buraya kadar fmt.Print() fonksiyonlarından bahsettik. Şimdi gelelim os.Stdout kısmına.

os.Stdout aşağı yukarı fmt.Print() ile aynıdır. stdout, fmt paketinde olmayan işlemlerin kullanılması gerektiği zamanlarda ihtiyaç duyulan işlevi göreceği için kendi paketinde de bulunur.

Şimdi bir örnek üzerinde konuşalım. Scriptimiz 3 parçadan oluşacak birinci parça,

Kod:
package main


import (
    "io"
    "os"

)

Birinci parçamız bu. io kullanmamız fmt kütüphanesinin yerini tutması için, os kullanmamız commanline ekranından input alabilmek içindir.

İkinci parçada,

Kod:
func main() {
	myStr := ""
	myArgs := os.Args
	
	if len(myArgs) == 1 {
		myStr = "give me args"	
	} else {
		myStr = myArgs[1]
	}
}

myStr içerisinde ekrana bastıracağım mesajı tutuyorum. Eğer bir argüman alarak çalıştırılırsa argümanı ekrana basıcak, aksi halde hardcoded mesajımız ekrana basılacaktır.

Üçüncü parçada,

Kod:
	io.WriteString(os.Stdout, myStr)
	io.WriteString(os.Stdout, "\n")
}

Burada io.WriteString() fonksiyonu fmt.Print() ile aynı işi görüyor. io.WriteString() iki adet parametre alır. Birincisi yazmak istediğim dosya, ikincisi string olarak yazılacak bir değer.

unix işletim sistemlerinde /dev/stdout dosyasına yazılan değer output olarak okunur ekrana yazılır. Burada bu sebeple os.Stdout kullandık.

Şimdi kodumuzu görelim ve çalıştıralım.



Çıktısı,



Şimdi /dev/stdin'den okuyalım.

Bunun için bufio paketini kullanacağız. Söylenenlere göre en file input ve output (I/O) işlemlerinde en sık kullanılan paket buymuş. https://golang.org/pkg/bufio/ paket hakkında detaylı bilgi bu linkte mevcut.

Geçelim yazı işlemine, iki parçadan oluşacak. Birinci kısım,

Kod:
package main

import (
	"bufio"
	"fmt"
	"os"
)

os paketinin buradaki görevi command-line olarak input almak. /dev/stdin dosyasına bizim inputlarımız yazılıyordu unix bunları buradaki dosyadan okuyordu. Biz de burada bu dosyayı okuyacağız. os paketi windowsda da aynı şekilde çalışıyor, çünkü platform bağımsız bir paket.

İkinci kısım,

Kod:
func main() {

	var f *os.File
	f = os.Stdin
	defer f.Close()

	scanner := bufio.NewScanner(f)
	for scanner.Scan() {
	    fmt.Println("!!!", scanner.Text())
	}
}

Öncelikle burada yaptığımız şey, bufio paketinden NewScanner() fonskiyonunu çağırdık ve os.Stdin'i parametre olarak verdik.

Çalışma aşamasından önce özellikle belirtmek istiyorum bizim inputlarımızı output olarak verirken başında !!! işareti olacaktır. Şimdi çalıştıralım.

İlk çalışma anı,



Bir input aldıktan sonra,



Durdurmak için ctrl + D tuşlarına basabilirsiniz.



Bundan sonraki konuda error handling ve log dosyalarından bahsediyor olacağız.

Okuduğunuz için teşekkür eder iyi forumlar dilerim.
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.