49
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

golang で string のポインタを取得する

Posted at

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 と空文字列を区別するような文字列が必要になったら,こういった仕組みの型を別に用意した方が良さそうです.


※前に書いた記事がポエムっぽかったのでそちらははてなに移しました.

49
25
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
49
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?