![pexels-photo-3671140.jpeg](/_next/image?url=https%3A%2F%2Fimages.ctfassets.net%2Fai4vjpehjr3j%2F4YXVt945GJMsrLiVbryMGb%2F0c788681664bcce3024ed67afa2e3455%2Fpexels-photo-3671140.jpeg&w=1920&q=75)
Go tips
![Kazuki Moriyama](/_next/image?url=https%3A%2F%2Fimages.ctfassets.net%2Fai4vjpehjr3j%2F2Oa6QzkYOe51LQiER7VEtN%2F6e819c38a98a1c649401b86861c40d53%2Fimage.png&w=96&q=75)
Kazuki Moriyama (森山 和樹)
nullableな値を使用したいとき
- jsonやdbスキーマを扱うときにnullableな値を扱いたい
- しかしgoでは値型に対してデフォルト値が存在して何も指定しない場合はそれが用いられてしまう
- i.e. stringのデフォは
""
- i.e. stringのデフォは
- null的な値を扱いたいときにはpointerを使う
- pointerのデフォ値は
nil
なので何も指定しないときはちゃんと何もないことが指定される
コンパイルするときに値を埋め込みたい
- まず変数を用意する
package main
var a string
- コンパイルするときに
ldflags
というオプションを使用すると値を埋め込める
go build -ldflags "-X main.a=hoge"
- これで
a
はプログラム中でhoge
という値になっている
埋め込みたい値がmain package以外にあるとき
- 基本的には上のやり方で行ける
- 変数までのパスがファイル名ではなくパッケージ名で有ることに注意
pointer型のフィールドを持つstructを値ベースで等値性を検証したい
- 以下のようなstructがあるとする
type A struct {
B *string
}
- これをそのまま比較するとpointerのアドレスで比較されるので同じ値のpointerを入れてても等値だとみなされない
a := "a"
b := "a"
A{&a} == A{&b} // false
- 値ベースでの比較を行い時には
reflect.DeepEqual
を使用する
reflect.DeepEqual(A{&a}, A{&b}) // true