---
# System prepended metadata

title: 例

---

Goではコンパイル時に `-ldflag` で変数に値をセットすることができる。
だいぶ以前から知られているようだが、久保田は今日知ったのでメモ。

# 例

```go=
package main

import (
	"fmt"
)

var (
        args1 string
        args2 string
)

func main() {
	fmt.Println(args1, args2)
}
```

のようなスクリプトがあった場合,そのままビルドすると

```
go build main.go
./main

```

のように空文字を出力するだけだが、

```
go build -ldflags "-X main.args1=aaa -X main.args2=bbb"
```

のようにコンパイル時にpackageと変数の値を指定すると、

```
./tmp14
aaa bbb
```

となり、指定した変数が代入される。

# 使いみち

コミットハッシュをセットして、デバッグに役立てている例が多い。
https://ols.wtf/2021/02/20/injecting-golang-variables-at-build-time.html

```
go build -ldflags "-X main.commitHash=$$(git rev-parse --short HEAD) -X main.commitDate=$$(git log -1 --format=%ct)"
```

```
curl localhost:1314/info
{"commit":"6d168d3","date":"1613819194"}
```
