見出し画像

golang new関数の使い方と注意点について解説

今回はgolangのnew関数について解説していきます。


new()関数

new関数は、指定された型の新しいインスタンスをメモリ上に割り当て、そのポインタを返す関数です。

また、new関数によって割り当てられた値は、その型のゼロ値で初期化されます。


new()関数の使い方

実際にnew関数をどのように使用するか見ていきましょう。

p := new(Person)

上記コードではPersonは何らかの型であり、pはPersonのポインタとなります。

new(Person)によって割り当てられたPersonインスタンスは、そのフィールドがすべてゼロ値で初期化されます。
ゼロ値はintの場合は0、stringの場合は""、ポインタの場合はnilとなります。

package main

import (
    "fmt"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    person := new(Person)

    person.Name = "Alice"
    person.Age = 30

    fmt.Println(person) 
    fmt.Println(*person)

    fmt.Println("Name:", person.Name) 
    fmt.Println("Age:", person.Age) 
}

上記コードでは、まずPersonという構造体が定義されています。

main関数内でnew関数を用いてPerson型の新しいインスタンスを作成し、ポインタを取得しています。このポインタを通じてPersonインスタンスのフィールドNameとAgeに値を設定し、その内容を出力しています。

new関数によって作成されるのは、ゼロ値で初期化された型のポインタです。
よってこのコードの実行結果は以下となります。

&{Alice 30}
{Alice 30}
Name: Alice
Age: 30


make()関数との違い

Go言語にはmake()関数という似た関数がありますが、異なる意味を持ちます。

new関数は、指定された型の新しいインスタンスのポインタを返しますが、make関数は、スライス、マップ、チャネルといったビルトインの参照型のために使われます。makeは新しいインスタンスを作成し、その初期化を行います。


new()関数の注意点

不必要な使用を避ける

構造体の場合はnew関数を使うよりも、構造体リテラルを使用してインスタンスを直接初期化する方が一般的です。

中でもファクトリ関数を定義して使用されることが多いです。


パフォーマンスの考慮

new関数を使用するとヒープメモリにインスタンスが割り当てられます。

大量の小さなオブジェクトを頻繁に生成する場合は、メモリ使用量やガベージコレクションに影響を与える可能性があるので注意しながら実装する必要があります。


golangをもっと詳しくなりたい方に

初めてのGo言語

Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。


詳解Go言語Webアプリケーション開発

こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。

以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。


【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)

まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。

この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。


現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

この経験に学べ

この記事が気に入ったらサポートをしてみませんか?