【Go入門】基本型と数値型変換(キャスト)・文字列リテラル

シェアする

こんにちは。Go入門ブログの第5回です。
前回の記事では、Goにおける変数と定数の基本的な取り扱いについて解説しました。

【Go入門】変数と定数

今回の記事では、Goが提供する基本型(組み込み型)を種類別に一覧形式で紹介し、仕様を解説します。
あわせて、型変換(キャスト)の仕方や文字列リテラルの記述方法、エスケープシーケンスなどについても言及します。
前回の記事とも関連が深い内容ですので、ぜひあわせてご一読ください。

論理値型

Goで論理値を表す型はboolです。
真を表す定数true、偽を表す定数falseのいずれかの値をとります。

// bool型の変数bを宣言し論理値を代入
var b bool
b = true

// :=を利用した型推論
b2 := false

数値型

数値型には大きく分けて整数型、浮動小数点型、複素数型があります。
更に、符号の有無や数値のサイズに応じて多くの型が用意されています。

基本的には、整数であればint、小数であればfloat64を使用すれば問題ないでしょう。
サイズを指定したり、符号なしの型を使うための特別な理由がある場合、以下の解説を参照してください。

整数型(符号あり)
int8 8ビット(-128~127)
int16 16ビット(-32768~32767)
int32 32ビット(-2147483648~2147483647)
int64 64ビット(-9223372036854775808~9223372036854775807)
int 実装依存(32または64 ビット)
rune int32の別名(エイリアス)/Unicodeのコードポイントを表す

符号有りの整数型は、サイズに応じてint8からint64の4種類用意されています。
intは実装に依存した整数型で、32ビットのシステムでは32ビットで、64ビットのシステムでは64ビットになります。
runeはUnicodeコードポイントを表す特殊な整数型ですが、int32の別名として定義されているため、rune型の値は実質的に32ビットの符号つき整数です。

整数型(符号なし)
uint8 8ビット(0~255)
uint16 16ビット(0~65535)
uint32 32ビット(0~4294967295)
uint64 64ビット(0~18446744073709551615)
uint 実装依存(32または64ビット)
uintptr 実装依存(ポインタの値をそのまま格納するのに充分な大きさの符号なし整数)
byte uint8の別名(エイリアス)

符号なし整数型は、負数をサポートしない分、正数の範囲なら符号ありの整数型の倍の範囲を扱うことができます。
符号あり整数型と同じくサイズごとに4種類の型が用意されています。なお、変数名のuは「unsigned」の頭文字です。
同様にuintもintの符号なし版と考えて問題ありません。

浮動小数点型
float32 IEEE-754 32-ビット浮動小数値
float64 IEEE-754 64-ビット浮動小数値

Goにはサイズの異なる2種類の浮動小数点型があります。
float32が単精度浮動小数点数、float64が倍精度浮動小数点数に対応する型であり、Javaなどにおけるfloat・doubleと同様に使用することができます。

複素数型
complex64 float32の実数部と虚数部を持つ複素数
complex128 float64の実数部と虚数部を持つ複素数

複素数とは、実数と虚数の2つの単位によって構成される数です。
複素数は、実数a、bと虚数単位iを使ってa + biというリテラルで記述されます。
数学に明るくない人には複素数自体があまり馴染みのないものですが、Go以外にもいくつかの言語で複素数型が標準で実装されています。

数値型の変換(キャスト)

Goで型変換を行う場合、明示的な変換が必要です。
たとえば以下の例を見てください。

package main

import "fmt"

func main() {

    var i int = 100
    var u uint = i
}

上記の例では、int型の変数iに数値100を代入し、uint型の変数uに変数iを代入しようとしています。
数値100はint型でもuint型でも扱える値ですが、変数uに変数iを代入する箇所でエラーとなってしまいます。
Goでは他の言語で見られるような、いわゆる暗黙的な型変換が行えないのです。

数値から数値への型変換は、型名(値)で行うことができます。

package main

import "fmt"

func main() {
    var i int = 100
    var f float64 = float64(i)
    var u uint = uint(f)
}

エラーが発生せずに異なる型への代入が行えることを確認してください。

文字列型

Goで文字列型として事前宣言済みの型はstringです。
文字列リテラルの記述方法としては、他言語でもよく採用されているダブルクォート(“)で囲う方法と、RAW文字列リテラルというバッククォート(`)で囲う方法があります。

ダブルクォートを用いたリテラルとエスケープシーケンス

基本的に使用したい文字列をダブルクォートで囲うだけです。
また、改行やタブなどの特殊な文字の表現には、バックスラッシュ(\)によるエスケープシーケンスが用意されています。
以下に使用頻度の高いエスケープシーケンスをいくつか例示します。

\\ バックスラッシュ
\’ シングルクォート
\” ダブルクォート
\n 改行(LF)
\r 改行(CR)
\t 水平タブ

それでは実際にダブルクォートを用いたリテラルの記述例をみてみましょう。

package main

import "fmt"

func main() {

    // ダブルクォートで囲うリテラル記述例
    var s string
    s = "ダブルクォートで囲う文字列リテラル"
    fmt.Println(s)

    // エスケープシーケンスの使用例
    escape := "エスケープシーケンスの使用例\n改行と\tタブを使用"
    fmt.Println(escape)

}

上記の例の実行結果は以下のようになります。

$ go run string.go
ダブルクォートで囲う文字列リテラル
エスケープシーケンスの使用例
改行と タブを使用
バッククォートを用いたリテラル

バッククォートを用いて記述するリテラルはRAW文字列リテラルといいます。
通常の文字列リテラルと比べ、以下のような特徴を持ちます。

  • 複数行にわたる文字列を記述できる(見た目通りに改行を保持する)
  • エスケープシーケンスが適用されない

つまり、記述された文字に対して何も後処理を行わずそのまま使用されるわけです。
さっそく例を見てみましょう。

package main

import "fmt"

func main() {

    // バッククォートで囲うリテラル記述例
    s := `
バッククォートを用いた文字列リテラル記述
複数行にわたる文字列を記述できる
エスケープシーケンスが適用されない
\nや\tなどはそのまま出力される
`

    fmt.Println(s)
}

実行結果は以下のようになります。

$ go run string.go

バッククォートを用いた文字列リテラル記述
複数行にわたる文字列を記述できる
エスケープシーケンスが適用されない
\nや\tなどはそのまま出力される

終わりに

本記事では、Goの基本型について詳細な解説を行い、あわせて数値型の変換と文字列型のリテラルについて説明しました。
型の取り扱いはプログラミングにおいて基礎的な知識ですが、誤って理解すると問題の原因となりがちです。
変数の宣言とあわせて確実にマスターしましょう。

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

フォローする

スポンサーリンク
スポンサーリンク