Unix terkenal kerana menyokong falsafah bahawa perintah harus melakukan satu perkara dan melakukannya dengan baik.
Operasi pemprosesan dan transformasi data yang canggih selalunya boleh dilakukan menggunakan operator paip cangkerang untuk merantai perintah bersama-sama supaya output satu menjadi input yang lain, memanipulasi dan mengubah data untuk mencapai hasil yang diinginkan.
Contohnya:
# Sort file names. ls | sort # Count files. ls -l | count -l # Print out unique file extensions. # 1. List all files that have extensions # 2. Transform the data (discard everything but extensions) # 3. Sort the list (data must be sorted to identify duplicates) # 4. Filter out duplicates # 5. Browse the results ls *.* | sed 's/.*\.//' | sort | uniq | less
Dengan Go, pengaturcara boleh mencipta arahan yang cekap dan berprestasi untuk memproses data. Kami akan menyentuh perkara ini dengan coretan berikut.
Intipati arahan yang boleh digunakan dalam operasi paip ialah ia membaca daripada stdin dan menulis kepada stdout.
add-line-numbers.go
package main import ( "bufio" "fmt" "os" ) func main() { // Buffered input that splits input on lines. input := bufio.NewScanner(os.Stdin) // Buffered output. output := bufio.NewWriter(os.Stdout) lineNo := 0 // Scan until EOF (no more input). for input.Scan() { text := input.Text() lineNo++ s := fmt.Sprintf("%03d %s\n", lineNo, text) // It would be simpler to just use fmt.Println, // but want to emphasize piping stdin to stdout // explicitly. // Intentionally ignoring return values. _, _ = output.WriteString(s) } // Always explicitly flush remaining buffered output. _ = output.Flush() }
Contoh ini membaca baris pada satu masa daripada stdin dan menulisnya semula ke stdout dengan setiap baris diawali dengan nombor baris. Di sini, kami menggunakan fail program itu sendiri sebagai input untuk menjana output bernombor.
$ cat add-line-numbers.go | go run add-line-numbers.go 001 package main 002 003 import ( 004 "bufio" 005 "fmt" 006 "os" 007 ) 008 009 func main() { 010 011 // Buffered input that splits input on lines. 012 input := bufio.NewScanner(os.Stdin) 013 014 // Buffered output. 015 output := bufio.NewWriter(os.Stdout) 016 017 lineNo := 0 018 019 // Scan until EOF (no more input). 020 for input.Scan() { 021 text := input.Text() 022 lineNo++ 023 s := fmt.Sprintf("%03d %s\n", lineNo, text) 024 025 // It would be simpler to just use fmt.Println, 026 // but want to emphasize piping stdin to stdout 027 // explicitly. 028 // Intentionally ignoring return values. 029 _, _ = output.WriteString(s) 030 031 } 032 033 // Always explicitly flush remaining buffered output. 034 _ = output.Flush() 035 036 }
Contoh ini membaca baris pada satu masa daripada stdin, base64 mengekodnya dan menulisnya semula kepada stdout.
package main import ( "bufio" "encoding/base64" "os" ) func main() { // Buffered input that splits input on lines. input := bufio.NewScanner(os.Stdin) // Base64 Encoder/writer. encoder := base64.NewEncoder( base64.StdEncoding, os.Stdout) // Scan until EOF (no more input). for input.Scan() { bytes := input.Bytes() _, _ = encoder.Write(bytes) _, _ = encoder.Write([]byte{'\n'}) } // Close the encoder and ensure it flushes remaining output _ = encoder.Close() }
Memandangkan pengimbas berpecah pada aksara baris baharu (n) tanpa mengembalikannya, anda perlu menulis baris baharu secara eksplisit selepas menulis setiap baris.
$ cat base64-encode.go | go run base64-encode.go cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImJ1ZmlvIgoJImVuY29kaW5nL2Jhc2U2NCIKCSJvcyIKKQoKZnVuYyBtYWluKCkgewoKCS8vIEJ1ZmZlcmVkIGlucHV0IHRoYXQgc3BsaXRzIGlucHV0IG9uIGxpbmVzLgoJaW5wdXQgOj0gYnVmaW8uTmV3U2Nhbm5lcihvcy5TdGRpbikKCgkvLyBCYXNlNjQgRW5jb2Rlci93cml0ZXIuCgllbmNvZGVyIDo9IGJhc2U2NC5OZXdFbmNvZGVyKAoJCWJhc2U2NC5TdGRFbmNvZGluZywKCQlvcy5TdGRvdXQpCgoJLy8gU2NhbiB1bnRpbCBFT0YgKG5vIG1vcmUgaW5wdXQpLgoJZm9yIGlucHV0LlNjYW4oKSB7CgkJYnl0ZXMgOj0gaW5wdXQuQnl0ZXMoKQoJCV8sIF8gPSBlbmNvZGVyLldyaXRlKGJ5dGVzKQoJCV8sIF8gPSBlbmNvZGVyLldyaXRlKFtdYnl0ZXsnXG4nfSkKCX0KCgkvLyBDbG9zZSB0aGUgZW5jb2RlciBhbmQgZW5zdXJlIGl0IGZsdXNoZXMgcmVtYWluaW5nIG91dHB1dAoJXyA9IGVuY29kZXIuQ2xvc2UoKQp9Cg==
Anda boleh mengesahkan teks telah dikodkan dengan betul dengan menyalurkan hasil yang dikodkan ke perintah base64 sistem (Linux dan MacOS) untuk menyahkodnya:
$ cat base64-encode.go | go run base64-encode.go | base64 -D package main import ( "bufio" "encoding/base64" "os" ) func main() { // Buffered input that splits input on lines. input := bufio.NewScanner(os.Stdin) // Base64 Encoder/writer. encoder := base64.NewEncoder( base64.StdEncoding, os.Stdout) // Scan until EOF (no more input). for input.Scan() { bytes := input.Bytes() _, _ = encoder.Write(bytes) _, _ = encoder.Write([]byte{'\n'}) } // Close the encoder and ensure it flushes remaining output _ = encoder.Close() }
Siaran ini adalah petikan daripada panduan pengenalan ringkas yang saya tulis tentang ciri perpustakaan standard Go yang berguna untuk mencipta alatan baris arahan: Pergi untuk Apl dan Alat CLI.
Atas ialah kandungan terperinci Alat Baris Perintah dengan Go: Piping Data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!