見出し画像

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

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


make()関数

make()関数は、スライス、マップ、チャネル等のビルトイン型の初期化に使用される関数です。この関数を使うことで新しいインスタンスをメモリ上に割り当て、適切な初期値で構造をセットアップすることができます。


make()関数の使い方

スライスの初期化

make()関数を使ってスライスを初期化する際には、スライスの型、長さ、容量を指定する必要があります。容量については省略することができますが、その場合は容量には長さと同じ値が設定されます。

s := make([]int, 10, 15)

上記コードで型[]intの長さ10、容量15のスライスを作成することができます。


マップの初期化

マップを初期化する際はmake()関数にキーとバリューの型を渡す必要があります。

m := make(map[string]int)

上記コードでキーがstring型、値がint型のマップを作成することができます。


チャネルの初期化

チャネルは、ゴルーチン間でのデータの受け渡しに使用されます。
チャネルの初期化はチャネルの型とバッファサイズを指定することができます。バッファサイズを指定しない場合は非バッファチャネルが作成されます。

ch := make(chan int, 5) 

上記コードで型intのバッファサイズ5のチャネルを作成することができます。


new()関数との違い

make()関数と似た関数でnew()関数というものがあります。この二つの関数の違いは以下になります。

make()関数:初期化済みのインスタンスを直接返却
new()関数:ゼロ値で初期化された指定された型の新しいインスタンスのポインタを返却

s1 := make([]int, 10)
s2 := new([]int)

上記コードにおいてlen(s1)は10 、len(*s2)は0になります。


make()関数の注意点

スライスの初期化時の注意点

スライスの容量は長さとは異なり、容量は後で変更できないため、十分な大きさを事前に確保しておくことが重要です。

スライスの長さが容量を超えると、新しい容量のスライスが作成され、元のスライスの内容が新しいスライスにコピーされます。コピーはコストがかかるため、適切な容量の初期設定が必要になります。


マップの初期化時の注意点

マップを初期化する際に、初期容量を指定することで再ハッシュのコストを減らすことができますが、容量は動的に拡張されるため、マップの場合は最初に完璧なサイズを設定しておく必要はありません。

m := make(map[string]int, 100) 

makeを使用せずに宣言されたマップはnilであり、そのままでは使用できません。

var m map[string]int
m = make(map[string]int


チャネルの初期化時の注意点

チャネルは、バッファサイズを指定して初期化できます。
バッファサイズが0の場合、チャネルは同期的になり、送信操作は受信操作が準備されるまでブロックされます。

逆にバッファなしチャネルは、送信者と受信者が同時に準備できるまでブロックするため、ゴルーチン間の同期に便利です。


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

初めてのGo言語

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


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

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

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


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

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

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


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

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

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

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


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

この経験に学べ

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