Go言語のデータ型と型変換
Go言語は静的型付け言語であり、それぞれのデータ型には特定の性質と操作があります。基本的なデータ型には以下のようなものがあります:
- 整数型(
int
,int8
,int16
,int32
,int64
,uint
,uint8
,uint16
,uint32
,uint64
) - 浮動小数点型(
float32
,float64
) - 複素数型(
complex64
,complex128
) - ブール型(
bool
) - 文字列型(
string
)
また、これらの基本型を元に、配列、スライス、マップ、チャネル、構造体、インターフェースなどの複合型を作ることができます。
Go言語では、型変換を明示的に行う必要があります。例えば、int
型からfloat64
型への変換は以下のように行います:
var i int = 42
var f float64 = float64(i)
このように、Go言語では型変換を用いて異なるデータ型間で値を安全に移動することができます。次のセクションでは、具体的に型からバイト配列への変換について見ていきましょう。
バイト配列への型変換
Go言語では、特定の型からバイト配列([]byte
)への変換は一般的に頻繁に行われます。これは、ファイルの読み書き、ネットワーク通信、暗号化、エンコーディング/デコーディングなど、多くの操作がバイト配列を基本として行われるためです。
例えば、文字列からバイト配列への変換は以下のように行います:
s := "hello, world"
b := []byte(s)
このコードは、文字列s
をバイト配列b
に変換します。文字列は基本的にバイトのシーケンスであるため、この変換は直感的で簡単です。
しかし、他の型、特に数値型からバイト配列への変換は少し複雑になります。これは、数値型の内部表現がマシンのエンディアン(バイトオーダー)に依存するためです。次のセクションでは、具体的にuint32
からバイト配列への変換について見ていきましょう。
uint32からバイト配列への変換
Go言語では、uint32
型からバイト配列([]byte
)への変換を行うためには、encoding/binary
パッケージを使用します。このパッケージは、数値をバイト配列に変換したり、その逆の操作を行ったりするための関数を提供しています。
以下に、uint32
型からバイト配列への変換を行うコードの例を示します:
package main
import (
"encoding/binary"
"fmt"
)
func main() {
var x uint32 = 1234567890
b := make([]byte, 4)
binary.BigEndian.PutUint32(b, x)
fmt.Println(b) // [73, 150, 2, 210]
}
このコードでは、まずuint32
型の変数x
を定義し、その値を1234567890
に設定しています。次に、長さ4のバイト配列b
を作成します。そして、binary.BigEndian.PutUint32
関数を使用して、x
の値をb
に格納します。この関数は、第一引数にバイト配列、第二引数にuint32
型の値を取り、その値をバイト配列にビッグエンディアン形式で格納します。
このように、Go言語ではencoding/binary
パッケージを使用することで、uint32
型からバイト配列への変換を簡単に行うことができます。次のセクションでは、固定長配列から可変長配列への変換について見ていきましょう。
固定長配列から可変長配列への変換
Go言語では、固定長配列から可変長配列(スライス)への変換は非常に簡単に行うことができます。以下に、その方法を示します:
var array [5]int = [5]int{1, 2, 3, 4, 5}
slice := array[:]
このコードでは、まずint
型の固定長配列array
を定義し、その値を[1, 2, 3, 4, 5]
に設定しています。次に、array[:]
というスライス式を使用して、array
の全要素からなるスライスを作成し、それをslice
に代入しています。
このように、Go言語ではスライス式を使用することで、固定長配列から可変長配列への変換を簡単に行うことができます。この変換は、配列の一部を切り出したり、配列全体をスライスとして扱いたい場合など、さまざまな場面で役立ちます。また、スライスは内部的には配列への参照を保持しているため、元の配列の要素を変更すると、それがスライスにも反映されます。これは、配列とスライスの間でデータを効率的に共有するための重要な特性です。この特性を理解しておくことで、Go言語の配列とスライスをより深く理解し、より効果的に利用することができます。