前書き
Goでは、データタイプを使用して特定のタイプのデータを分類し、そのタイプに割り当てることができる値と、そのデータに対して実行できる操作を決定します。 プログラミングの際に、値を異なる方法で操作するために、タイプ間で値を変換する必要がある場合があります。 たとえば、数値を文字列と連結したり、整数値として初期化された数値の小数点以下の桁を表す必要がある場合があります。 多くの場合、ユーザー生成データには、数字で構成されている場合でも、文字列データ型が自動的に割り当てられます。この入力で数学演算を実行するには、文字列を数値データ型に変換する必要があります。
Goは静的に型付けされた言語であるため、値ではなくdata types are bound to variablesです。 つまり、変数をint
として定義した場合、それはint
のみになります。変数のデータ型を変換せずにstring
を割り当てることはできません。 Goのデータ型の静的な性質は、データ型を変換する方法を学ぶことをさらに重要にしています。
このチュートリアルでは、数字と文字列の変換について説明するとともに、さまざまなユースケースに慣れるための例を提供します。
数値型の変換
Goにはいくつかの数値タイプがあります。 主に、integersとfloating-point numbersの2つの一般的なタイプに分類されます。
数値型間で変換する必要がある状況は数多くあります。 different sizes of numeric types間の変換は、特定の種類のシステムアーキテクチャのパフォーマンスを最適化するのに役立ちます。 コードの別の部分から整数を取得し、その整数で除算する場合、整数を浮動小数点数に変換して、演算の精度を維持することができます。 さらに、通常、期間の処理には整数変換が含まれます。 これらの状況に対処するために、Goにはほとんどの数値タイプにtype conversionsが組み込まれています。
整数型間の変換
Goには多くの整数データ型があります。 どちらを使用するかは、通常、performanceについてです。ただし、ある整数型から別の整数型に変換する必要がある場合があります。 たとえば、Goは数値をint
として自動的に生成することがありますが、これは入力値と一致しない場合があります。 入力値がint64
の場合、データ型を一致するように変換するまで、同じ数式でint
とint64
の数値を使用することはできません。
int8
があり、それをint32
に変換する必要があると仮定します。 これを行うには、int32()
型変換でラップします。
var index int8 = 15
var bigIndex int32
bigIndex = int32(index)
fmt.Println(bigIndex)
Output15
このコードブロックは、index
をint8
データ型として定義し、bigIndex
をint32
データ型として定義します。 index
の値をbigIndex
に格納するために、データ型をint32
に変換します。 これは、int32()
変換をindex
変数の周りにラップすることによって行われます。
データ型を確認するには、次の構文でfmt.Printf
ステートメントと%T
動詞を使用できます。
fmt.Printf("index data type: %T\n", index)
fmt.Printf("bigIndex data type: %T\n", bigIndex)
Outputindex data type: int8
bigIndex data type: int32
これは%T
動詞を使用するため、printステートメントは変数の実際の値ではなく、変数の型を出力します。 これにより、変換されたデータ型を確認できます。
より大きなビットサイズの整数からより小さなビットサイズの整数に変換することもできます。
var big int64 = 64
var little int8
little = int8(big)
fmt.Println(little)
Output64
整数を変換するとき、データ型とwraparoundの最大値を超える可能性があることに注意してください。
var big int64 = 129
var little = int8(big)
fmt.Println(little)
Output-127
値を保持するには小さすぎるデータ型に値が変換されると、ラップアラウンドが発生します。 前の例では、8ビットのデータ型int8
には、64ビットの変数big
を保持するのに十分なスペースがありませんでした。 誤ってデータを切り捨てないように、大きい数値のデータ型から小さい数値のデータ型に変換するときは、常に注意が必要です。
整数から浮動小数点数への変換
Goで整数を浮動小数点数に変換することは、ある整数型を別の整数型に変換することに似ています。 変換する整数の周りにfloat64()
またはfloat32()
をラップすることにより、組み込み型変換を使用できます。
var x int64 = 57
var y float64 = float64(x)
fmt.Printf("%.2f\n", y)
Output57.00
このコードは、タイプint64
の変数x
を宣言し、その値を57
に初期化します。
var x int64 = 57
float64()
変換をx
の周りにラップすると、57
の値が57.00
の浮動小数点値に変換されます。
var y float64 = float64(x)
%.2f
のprint動詞は、fmt.Printf
にfloatを小数点以下2桁でフォーマットするように指示します。
このプロセスを変数で使用することもできます。 次のコードは、f
が57
と等しいことを宣言してから、新しいフロートを出力します。
var f float64 = 57
fmt.Printf("%.2f\n", f)
Output57.00
float32()
またはfloat64()
のいずれかを使用することにより、整数を浮動小数点数に変換できます。 次に、フロートを整数に変換する方法を学びます。
浮動小数点数から整数への変換
Goは浮動小数点数を整数に変換できますが、プログラムは浮動小数点数の精度を失います。
フロートをint()
、またはそのアーキテクチャに依存しないデータ型の1つでラップすると、ある整数型から別の整数型に変換するために使用した場合と同様に機能します。 括弧内に浮動小数点数を追加して、整数に変換できます。
var f float64 = 390.8
var i int = int(f)
fmt.Printf("f = %.2f\n", f)
fmt.Printf("i = %d\n", i)
Outputf = 390.80
i = 390
この構文は、浮動小数点数390.8
を整数390
に変換し、小数点以下の桁数を削除します。
これを変数とともに使用することもできます。 次のコードは、b
を125.0
に等しく、c
を390.8
に等しいと宣言し、それらを整数として出力します。 短い変数宣言(:=
)は、構文を短縮します。
b := 125.0
c := 390.8
fmt.Println(int(b))
fmt.Println(int(c))
Output125
390
浮動小数点数をint()
タイプの整数に変換する場合、Goは浮動小数点数の小数と残りの数値を切り捨てて整数を作成します。 390.8を391に切り上げたい場合でも、Goはint()
タイプではこれを行わないことに注意してください。 代わりに、小数をドロップします。
除算で変換された数字
Goで整数型を除算すると、結果も整数型になり、modulusまたは余りが削除されます。
a := 5 / 2
fmt.Println(a)
Output2
分割するときに数値型のいずれかが浮動小数点数である場合、すべての数値型は自動的に浮動小数点数として宣言されます。
a := 5.0 / 2
fmt.Println(a)
Output2.5
これにより、float5.0
が整数2
で除算され、回答2.5
は10進数の精度を保持するfloatになります。
このセクションでは、異なるサイズの整数や浮動小数点数など、異なる数のデータ型間で変換しました。 次に、数字と文字列を変換する方法を学びます。
文字列を使用した変換
stringは、1つ以上の文字(文字、数字、または記号)のシーケンスです。 文字列は、コンピュータープログラムのデータの一般的な形式であり、特にユーザー生成データを取り込む場合は、文字列を数字に変換するか、数字を文字列に変換する必要がある場合があります。
数値を文字列に変換する
Go標準ライブラリのstrconv
パッケージのstrconv.Itoa
メソッドを使用して、数値を文字列に変換できます。 メソッドの括弧に数値または変数を渡すと、その数値は文字列値に変換されます。
まず、整数の変換を見てみましょう。 整数12
を文字列値に変換するには、12
をstrconv.Itoa
メソッドに渡すことができます。
package main
import (
"fmt"
"strconv"
)
func main() {
a := strconv.Itoa(12)
fmt.Printf("%q\n", a)
}
このプログラムを実行すると、次の出力が表示されます。
Output"12"
数字12を囲む引用符は、数字が整数ではなく文字列値になったことを示します。
:=
代入演算子を使用して、a
という名前の新しい変数を宣言し、strconv.Itoa()
関数から返された値を割り当てました。 この場合、変数に値12
を割り当てました。 また、fmt.Printf
関数で%q
動詞を使用しました。これは、提供された文字列を引用するように関数に指示します。
変数を使用すると、整数を文字列に変換することがいかに実用的であるかを確認できます。 ユーザーの毎日のプログラミングの進行状況を追跡し、一度に何行のコードを記述するかを入力するとします。 このフィードバックをユーザーに表示し、文字列と整数値を同時に出力します。
package main
import (
"fmt"
)
func main() {
user := "Sammy"
lines := 50
fmt.Println("Congratulations, " + user + "! You just wrote " + lines + " lines of code.")
}
このコードを実行すると、次のエラーが表示されます。
Outputinvalid operation: ("Congratulations, " + user + "! You just wrote ") + lines (mismatched types string and int)
Goでは文字列と整数を連結できないため、変数lines
を文字列値に変換する必要があります。
package main
import (
"fmt"
"strconv"
)
func main() {
user := "Sammy"
lines := 50
fmt.Println("Congratulations, " + user + "! You just wrote " + strconv.Itoa(lines) + " lines of code.")
}
これで、コードを実行すると、ユーザーの進捗状況を祝福する次の出力が表示されます。
OutputCongratulations, Sammy! You just wrote 50 lines of code.
整数を文字列に変換するのではなく、フロートを文字列に変換する場合は、同様の手順と形式に従います。 フロートをfmt.Sprint
メソッドに渡すと、Go標準ライブラリのfmt
パッケージから、フロートの文字列値が返されます。 float値自体または変数のいずれかを使用できます。
package main
import (
"fmt"
)
func main() {
fmt.Println(fmt.Sprint(421.034))
f := 5524.53
fmt.Println(fmt.Sprint(f))
}
Output421.034
5524.53
文字列と連結することにより、正しいことを確認するためにテストできます。
package main
import (
"fmt"
)
func main() {
f := 5524.53
fmt.Println("Sammy has " + fmt.Sprint(f) + " points.")
}
OutputSammy has 5524.53 points.
連結がエラーなしで実行されたため、フロートが文字列に適切に変換されたことを確認できます。
文字列を数値に変換する
文字列は、Go標準ライブラリのstrconv
パッケージを使用して数値に変換できます。 strconv
パッケージには、整数型と浮動小数点型の両方を変換するための関数があります。 これは、ユーザーからの入力を受け入れるときの非常に一般的な操作です。 たとえば、ある人の年齢を尋ねるプログラムがある場合、その人が応答を入力すると、string
としてキャプチャされます。 次に、それを使用して計算を行うには、それをint
に変換する必要があります。
文字列に小数点以下の桁数がない場合は、strconv.Atoi
関数を使用して文字列を整数に変換することをお勧めします。 数値を浮動小数点数として使用することがわかっている場合は、strconv.ParseFloat
を使用します。
毎日書かれたコード行を追跡するユーザーSammyの例を使用してみましょう。 これらの値を数学で操作して、ユーザーにさらに興味深いフィードバックを提供したい場合がありますが、これらの値は現在文字列に格納されています。
package main
import (
"fmt"
)
func main() {
lines_yesterday := "50"
lines_today := "108"
lines_more := lines_today - lines_yesterday
fmt.Println(lines_more)
}
Outputinvalid operation: lines_today - lines_yesterday (operator - not defined on string)
2つの数値は文字列に格納されていたため、エラーを受け取りました。 減算のオペランド-
は、2つの文字列値の有効なオペランドではありません。
文字列を整数に変換するstrconv.Atoi()
メソッドを含めるようにコードを変更します。これにより、元々文字列であった値を使用して計算を行うことができます。 文字列を整数に変換すると失敗する可能性があるため、エラーをチェックする必要があります。 if
ステートメントを使用して、変換が成功したかどうかを確認できます。
package main
import (
"fmt"
"log"
"strconv"
)
func main() {
lines_yesterday := "50"
lines_today := "108"
yesterday, err := strconv.Atoi(lines_yesterday)
if err != nil {
log.Fatal(err)
}
today, err := strconv.Atoi(lines_today)
if err != nil {
log.Fatal(err)
}
lines_more := today - yesterday
fmt.Println(lines_more)
}
文字列が数値でない可能性があるため、strconv.Atoi()
メソッドは、変換された型と潜在的なエラーの両方を返します。 strconv.Atoi
関数を使用してlines_yesterday
から変換する場合は、err
の戻り値をチェックして、値が変換されたことを確認する必要があります。 err
がnil
でない場合は、strconv.Atoi
が文字列値を整数に正常に変換できなかったことを意味します。 この例では、if
ステートメントを使用してエラーをチェックし、エラーが返された場合は、log.Fatal
を使用してエラーをログに記録し、プログラムを終了しました。
上記のコードを実行すると、次のものが得られます。
Output58
次に、数字ではない文字列を変換してみます。
package main
import (
"fmt"
"strconv"
)
func main() {
a := "not a number"
b, err := strconv.Atoi(a)
fmt.Println(b)
fmt.Println(err)
}
以下のエラーが発生します。
Output0
strconv.Atoi: parsing "not a number": invalid syntax
b
が宣言されたが、strconv.Atoi
が変換に失敗したため、値がb
に割り当てられることはありませんでした。 b
の値は0
であることに注意してください。 これは、Goにはデフォルト値があり、Goではゼロ値と呼ばれるためです。 strconv.Atoi
は、文字列の変換にも失敗した理由を説明するエラーを提供します。
文字列とバイトの変換
Goの文字列は、バイトのスライスとして保存されます。 Goでは、バイトのスライスと文字列を、対応する[]byte()
とstring()
の変換でラップすることにより、変換できます。
package main
import (
"fmt"
)
func main() {
a := "my string"
b := []byte(a)
c := string(b)
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
}
ここでは、文字列値をa
に格納し、それをバイトのスライスb
に変換してから、バイトのスライスをc
として文字列に変換し直しました。 次に、a
、b
、およびc
を画面に出力します。
Outputmy string
[109 121 32 115 116 114 105 110 103]
my string
出力の最初の行は元の文字列my string
です。 出力される2行目は、元の文字列を構成するバイトスライスです。 3行目は、バイトスライスを安全に変換して文字列に戻し、印刷して戻すことができることを示しています。
結論
このGoチュートリアルでは、主に組み込みメソッドを使用して、重要なネイティブデータ型のいくつかを他のデータ型に変換する方法を示しました。 Goでデータ型を変換できるようになると、ユーザー入力を受け入れたり、異なる数値型間で数学を実行したりすることができます。 後で、Goを使用して、データベースやAPIなどのさまざまなソースからデータを受け入れるプログラムを作成する場合、これらの変換メソッドを使用して、データを操作できるようにします。 また、データをより小さなデータ型に変換することにより、ストレージを最適化することもできます。
Goのデータ型の詳細な分析が必要な場合は、Understanding Data Types in Goの記事を確認してください。