string のポインタが必要になる状況
string のゼロは空文字列""
です.nil になることはありません.ただし,空文字列とは別に特別な値を取りたいこともあります.
たとえば ORM ライブラリ gorm の Hstore (key=>valueが入れられる postgresql のカラム)は
type Hstore map[string]*string
と定義されていて,key=>valueの value の方を文字列のポインタで扱うようになってます.これは DB の方の value が NULL をとれたりする(空文字列じゃなくてNULLがセットできる)ためです.
文字列のポインタを得る
a := &"Hello, World"
とやっても
cannot take the address of "Hello, World"
と怒られます.
解決方法
(1)いったん変数に代入してそのアドレスを取る
tmp := "Hello, World"
a := &tmp
(2)アドレスを返す関数を用意しておく
func toPtr(s string) *string {
return &s
}
a := toPtr("Hello, World")
設計を見直す?
普通は string のポインタ使ってる時点で何かおかしいんで,こういうこと考えなきゃいけないときは設計を見直した方が良さそうです.
NULL の時もある文字列みたいなものを表現するのに,sql パッケージにはsql.NullString というものが用意されています.
type NullString struct {
String string
Valid bool // Valid is true if String is not NULL
}
フラグを立てて,Valid じゃないときは NULL として扱うようになってます.
どうしても NULL と空文字列を区別するような文字列が必要になったら,こういった仕組みの型を別に用意した方が良さそうです.
※前に書いた記事がポエムっぽかったのでそちらははてなに移しました.