こんにちは。Tomoyuki(@tomoyuki65)です。
Go言語(Golang)にはメモリを確保してそのポインタを返す組み込み関数のnewがありますが、バージョン1.26からnew(expr)が導入され、値(式)から直接ポインタを作ることができるようになりました。
この記事では、そんなGo言語(Golang)のnew(expr)についてご紹介します。
Go言語(Golang)1.26で導入されたnew(expr)とは?|使い方・メリット・従来のnew関数との違いを解説
new関数とは?
Go言語(Golang)のnew関数は、指定した型のゼロ値を格納するメモリを確保し、そのポインタを返す組み込み関数です。
例えばint型の変数を定義してからポインタを取得する方法と、それをnew関数で書き換えた場合の例は次の通りです。
// int型の変数を定義してからポインタを取得
var x int
p := &x
// new関数を使ってポインタを取得
p := new(int)
new(expr)とは?
次にGo言語(Golang)のバージョン1.26で導入された new(expr) について、exprは「式(expression)」の略です。
これまではnew(T) のように型のみを引数として渡せましたが、Go言語のバージョン1.26からは式も渡せるようになり、式の評価結果で初期化された新しい変数へのポインタを1行で生成できるようになりました。
例えば数値「6」を変数に格納し、その変数のポインタを取得する方法と、それをnew(expr)で書き換えた場合の例は次の通りです。
// 数値「6」を変数に格納し、その変数のポインタを取得
num := 6
p := &num
// new(expr)を使ってポインタ取得
p := new(6)
new(expr)を使うメリットは?
そんなnew(expr)の最大のメリットは、「値のポインタを簡単に作成できること」です。
従来はリテラル値や式の結果のアドレスを直接取得できなかったため、一時変数やヘルパー関数を用意する必要があり、コードが冗長になりがちでした。
new(expr)の使い所は?
一番よく使われる可能性があるのは、構造体の設定値などです。
例えばユーザー情報に関する構造体があり、その値を設定する際における従来の設定方法と、new(expr)を使った設定方法の例は次の通りです。
// ユーザー情報の構造体
type User struct {
Name *string `json:"name,omitempty"`
Age *int `json:"age,omitempty"`
}
// 従来の設定方法
name := "田中太郎"
age := 25
user := &User{
Name: &name,
Age: &age,
}
// new(expr)を使った設定方法
user := &User{
Name: new("田中太郎"),
Age: new(25),
}
最後に
今回はGo言語(Golang)のバージョン1.26で導入されたnew(expr)についてご紹介しました。
値のポインタを作る必要がある場合は、new(expr)を使うことで簡単に作成できるようになったため、Goのバージョン1.26以上を利用する際はぜひ参考にしてみて下さい。


コメント