Skip to content

Commit 664eea7

Browse files
committed
Add main_stdout_ospipe example
1 parent 2eff125 commit 664eea7

File tree

4 files changed

+87
-0
lines changed

4 files changed

+87
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
app
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# https://taskfile.dev
2+
3+
version: '3'
4+
5+
tasks:
6+
default:
7+
cmds:
8+
- go build -o app .
9+
- ./app -v "hello" -v "world" -v "へろー" -v "ワールド"
10+
- go test .
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"strings"
7+
)
8+
9+
type (
10+
vars []string
11+
)
12+
13+
func (me *vars) String() string {
14+
return fmt.Sprint(*me)
15+
}
16+
17+
func (me *vars) Set(v string) error {
18+
*me = append(*me, v)
19+
return nil
20+
}
21+
22+
var (
23+
_ flag.Value = (*vars)(nil)
24+
)
25+
26+
func main() {
27+
var (
28+
vs vars
29+
)
30+
flag.Var(&vs, "v", "values")
31+
flag.Parse()
32+
33+
fmt.Println(strings.Join(vs, ","))
34+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"io"
6+
"os"
7+
"sync"
8+
"testing"
9+
)
10+
11+
func TestMainOutput(t *testing.T) {
12+
// 元の標準出力を退避させ、パイプのWriter側に差し替え
13+
old := os.Stdout
14+
r, w, _ := os.Pipe()
15+
os.Stdout = w
16+
defer func() {
17+
// 元に戻す。このプログラムはこのまま終了するので別にしなくて良いが習慣として。
18+
os.Stdout = old
19+
}()
20+
21+
// コマンドライン引数
22+
os.Args = append(os.Args, "-v", "hello", "-v", "world", "-v", "へろー", "-v", "ワールド")
23+
24+
var wg sync.WaitGroup
25+
wg.Add(1)
26+
27+
// パイプはノンバッファリングなので非同期処理が必須
28+
go func() {
29+
defer wg.Done()
30+
defer w.Close()
31+
main()
32+
}()
33+
34+
wg.Wait()
35+
36+
// 出力内容を確認
37+
want := []byte("hello,world,へろー,ワールド\n")
38+
got, _ := io.ReadAll(r)
39+
if !bytes.Equal(want, got) {
40+
t.Errorf("want: %s\tgot: %s", want, got)
41+
}
42+
}

0 commit comments

Comments
 (0)