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