Go and UNIX Philosophy

@yuya_takeyama

2015/08/26 Kyobashi.go #1

こんにちは

今まで Go で作ってきたもの

今日話す内容

今日話さない内容

何故 Go で書くか

その他 Go やってみて感じたこと

それでも Go を使わない場合

UNIX 哲学とは

UNIX 哲学とは

UNIXという考え方

マイク・ガンカーズの UNIX 哲学 (一部抜粋)

UNIX プログラムとは

$ seq 100 | awk '$1 % 2 == 0' | tail
82
84
86
88
90
92
94
96
98
100

UNIX プログラムとは

UNIX 哲学の普遍性

Go でも UNIX っぽいプログラミングがしたい!

Go におけるパイプ

io.Readerio.Writer

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

Go で cat を実装してみる

func Copy(dst Writer, src Reader) (written int64, err error)

Go で cat を実装してみる (1)

入力としてファイルをひとつを受け取る

import (
    "io"
    "os"
)

func main() {
    file, _ := os.Open(os.Args[1]) // io.Reader
    io.Copy(os.Stdout, file)
}

Go で cat を実装してみる (2)

入力としてファイルをふたつ受け取る

import (
    "io"
    "os"
)

func main() {
    file1, _ := os.Open(os.Args[1])        // io.Reader
    file2, _ := os.Open(os.Args[2])        // io.Reader
    reader := io.MultiReader(file1, file2) // io.Reader
    io.Copy(os.Stdout, reader)
}

Go で cat を実装してみる (3)

入力として標準入力または複数のファイルを受け取る

import (
    "io"
    "os"
    "github.com/yuya-takeyama/argf"
)

func main() {
    reader, _ := argf.Argf() // io.Reader
    io.Copy(os.Stdout, reader)
}

I/O を使ったプログラムのテスト

まとめ

ありがとうございました