Skip to content

Commit 56a9e86

Browse files
committed
Add gcflags and ldflags example
1 parent e47f23c commit 56a9e86

File tree

4 files changed

+123
-0
lines changed

4 files changed

+123
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
normal
2+
debug
3+
release
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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+
```
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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}'
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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+
}

0 commit comments

Comments
 (0)