File tree Expand file tree Collapse file tree 4 files changed +123
-0
lines changed
examples/singleapp/gcflags_ldflags_debug_release_build Expand file tree Collapse file tree 4 files changed +123
-0
lines changed Original file line number Diff line number Diff line change 1+ normal
2+ debug
3+ release
Original file line number Diff line number Diff line change 1+ # これは何?
2+
3+ Goにてデバッグビルドするときと、リリースビルドするときによく利用するフラグについて。
4+
5+ ## デバッグ
6+
7+ ``` sh
8+ go build -gcflags " all=-N -l" -o debug main.go
9+ ```
10+
11+ ### オプションの意味
12+
13+ ```
14+ # gcflags の all=-N -l の意味 (goコンパイラに対しての指示) (go tool compile -help)
15+ # all= は全てのパッケージが対象という意味
16+ # -N は最適化無効という意味 (No optimization)
17+ # -l はインライン化無効という意味 (No inlining)
18+ ```
19+
20+ ## リリース
21+
22+ ``` sh
23+ go build -ldflags " -s -w" -o release main.go
24+ ```
25+
26+ ### オプションの意味
27+
28+ ```
29+ # ldflags の -s -w の意味 (リンカに対しての指示) (go tool link -help)
30+ # -s はシンボルテーブル削除という意味
31+ # -w はDWARF情報削除という意味(デバッグ情報)
32+ ```
Original file line number Diff line number Diff line change 1+ # https://taskfile.dev
2+
3+ version : ' 3'
4+
5+ vars :
6+ RE1 : main\.go.*inlining call.*$
7+
8+ tasks :
9+ default :
10+ cmds :
11+ # gcflags の all=-m -N -l の意味 (goコンパイラに対しての指示) (go tool compile -help)
12+ # all= は全てのパッケージが対象という意味
13+ # -m はビルド時のコンパイラの詳細情報を出力せよという意味
14+ # -N は最適化無効という意味 (No optimization)
15+ # -l はインライン化無効という意味 (No inlining)
16+ - cmd : go build -gcflags "all=-m -N -l" -o debug main.go 2>&1 | grep "{{.RE1}}"
17+ ignore_error : true
18+ - cmd : go build -gcflags "all=-m" -o normal main.go 2>&1 | grep "{{.RE1}}"
19+ ignore_error : true
20+ # ldflags の -s -w の意味 (リンカに対しての指示) (go tool link -help)
21+ # -s はシンボルテーブル削除という意味
22+ # -w はDWARF情報削除という意味(デバッグ情報)
23+ - cmd : go build -gcflags "all=-m" -ldflags "-s -w" -o release main.go 2>&1 | grep "{{.RE1}}"
24+ ignore_error : true
25+ - ls -l {normal,debug,release} | awk 'NF>1 {print $5, $NF}'
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "io"
5+ "log"
6+ "sync"
7+ "time"
8+ )
9+
10+ func main () {
11+ log .SetFlags (0 )
12+ log .SetOutput (io .Discard )
13+
14+ if err := run (); err != nil {
15+ panic (err )
16+ }
17+ }
18+
19+ // この関数は最適化が有効な場合、直接 v*2 になる可能性があり
20+ // インライン化が有効な場合、インライン化される可能性がある
21+ func calc (v int ) int {
22+ v1 := v
23+ v2 := 2
24+ return v1 * v2
25+ }
26+
27+ func run () error {
28+ const (
29+ COUNT = 10000000
30+ WORKERS = 4
31+ )
32+ var (
33+ ch = make (chan int )
34+ wg sync.WaitGroup
35+ )
36+
37+ // producer
38+ wg .Add (1 )
39+ go func (ch chan <- int ) {
40+ defer wg .Done ()
41+ defer close (ch )
42+
43+ for i := range COUNT {
44+ ch <- calc (i )
45+ }
46+ }(ch )
47+
48+ time .Sleep (10 * time .Millisecond )
49+
50+ // consumer
51+ for range WORKERS {
52+ wg .Add (1 )
53+ go func (ch <- chan int ) {
54+ for v := range ch {
55+ log .Println (v )
56+ }
57+ }(ch )
58+ }
59+
60+ wg .Done ()
61+
62+ return nil
63+ }
You can’t perform that action at this time.
0 commit comments