Go_データ構造整理

date
Oct 10, 2019
slug
type list
status
Published
tags
Golang
summary
Golangデータ構造一覧
type
Post

GOデータ構造の比較

Golangのデータ構造、基本の型、および参照型に関する特徴と注意点を比較したものです。
 
Goのデータ型には、
基本型(数値型 / 浮動小数点型 / 論理値型 / 文字列型 / rune / byte)
合成型(配列 / 構造体)
参照型(Slice / Map / ポインタ / チャネル / 関数)といった型が存在します。ここでは、各データ型について簡単な処理を実行させて、動作確認をしていきます。
 
データ構造 / 基本の型
特徴
注意点
配列(Array)
- 固定長の要素の集合であり、連続したメモリ領域に格納される- 要素へのアクセスが高速- メモリ効率が良い
- 配列のサイズは宣言時に決定され、変更できない- 要素の追加や削除が困難- 配列のサイズが大きい場合、メモリの無駄が生じる可能性がある
スライス(Slice)
- 可変長の要素の集合であり、配列のラッパーとして機能する- ポインタ、長さ、容量の情報を持つ- 動的なサイズ変更が可能
- スライスは参照型であり、元の配列を参照しているため、スライスの操作が元の配列に影響を与える場合がある- スライスの要素へのアクセスは配列よりも若干遅い
マップ(Map)
- キーと値のペアを格納する- 動的にサイズ変更が可能- キーを使用して高速な要素の検索が可能
- マップは順序が定義されていないため、要素の順序を保証しない- マップの要素へのアクセスは配列よりも遅い- マップの要素数は実行時に動的に変更される可能性があるため、パフォーマンスに注意が必要
構造体(Struct)
- 異なるデータ型のフィールドを持つ複合データ型- メンバへのアクセスが高速- カスタムのデータ型を作成するための柔軟性を提供
- 構造体は値型であり、代入や関数の呼び出しでコピーが発生する- メンバの順序が重要であり、順序の変更が意図しないバグを引き起こす可能性がある
インターフェース(Interface)
- メソッドの集まりを定義し、多態性を実現する- インターフェースを実装する型は自動的にインターフェースとして扱われる- コードの柔軟性と拡張性を向上させる
- インターフェースは値型であり、代入や関数の呼び出しでコピーが発生する- インターフェースの使用はオーバーヘッドを伴う場合があり、パフォーマンスの影響を受ける可能性がある
チャネル(Channel)
- 並行処理やゴルーチン間の通信を実現する- データの送受信に使用される- 同期的な操作により、データの安全な共有が可能
- チャネルは同期的な操作を行うため、デッドロックやデータ競合に注意が必要- バッファサイズを指定することで非同期な操作を行うチャネルを作成できるが、バッファがいっぱいになると送信側がブロックされる
ポインタ(Pointer)
- メモリ上の別の変数やデータへの参照を保持する- メモリの効率的な使用や関数間のデータの共有を可能にする
- ポインタはNULLになる可能性があるため、使用する前にnilチェックが必要- ポインタの誤った使用は無効なメモリアクセスやパニックを引き起こす可能性がある
整数型
- 符号付きまたは符号なしの整数値を格納する- ビット数に応じて異なる範囲の値を表現可能
- 整数オーバーフローに注意が必要- 符号付き整数型の符号拡張に注意が必要
浮動小数点型
- 実数値を表現するための浮動小数点数を格納する- 単精度と倍精度の浮動小数点数が利用可能
- 浮動小数点の精度や丸め誤差に注意が必要- 比較演算子の使用に注意が必要
文字列型
- 文字の連続したシーケンスを格納する- 文字列リテラルはダブルクォートで囲まれる
- 文字列はイミュータブルであるため、変更する場合は新しい文字列を作成する必要がある- 文字列操作には注意が必要な場合があります
論理型
- 真(true)または偽(false)の論理値を表現する- 条件式の評価や制御フローの制御に使用される
- 論理型は単純な値を持つため、条件式やブール演算に適切に使用する必要がある- ゼロ値は偽(false)として評価されるため、初期化に注意が必要
 
記事に関する疑問があればお気軽にご連絡ください。