Goでデータ型を変換する方法
序章
Goでは、データ型を使用して特定の種類のデータを分類し、その種類に割り当てることができる値と、その種類に対して実行できる操作を決定します。 プログラミング時には、異なる方法で値を操作するために、タイプ間で値を変換する必要がある場合があります。 たとえば、数値を文字列と連結したり、整数値として初期化された数値の小数点以下の桁数を表す必要がある場合があります。 ユーザーが生成したデータには、数字で構成されている場合でも、文字列データ型が自動的に割り当てられることがよくあります。 この入力で数学演算を実行するには、文字列を数値データ型に変換する必要があります。
Goは静的に型付けされた言語であるため、データ型は値ではなく変数にバインドされます。 これは、変数を int
、それは int
; 割り当てることはできません string
変数のデータ型を変換せずにそれに。 Goのデータ型の静的な性質により、データ型を変換する方法を学ぶことがさらに重要になります。
このチュートリアルでは、数値と文字列の変換について説明し、さまざまなユースケースに慣れるための例を示します。
数値タイプの変換
Goにはいくつかの数値タイプから選択できます。 主に、整数と浮動小数点数の2つの一般的なタイプに分類されます。
数値タイプ間で変換したい状況はたくさんあります。 異なるサイズの数値タイプ間で変換すると、特定の種類のシステムアーキテクチャのパフォーマンスを最適化するのに役立ちます。 コードの別の部分からの整数があり、それを除算したい場合は、演算の精度を維持するために整数を浮動小数点数に変換することをお勧めします。 さらに、期間の操作には通常、整数変換が含まれます。 これらの状況に対処するために、Goにはほとんどの数値型に型変換が組み込まれています。
整数型間の変換
Goには、選択できる整数データ型が多数あります。 どちらを使用するかは、通常、パフォーマンスに関するものです。 ただし、ある整数型から別の整数型に変換する必要がある場合があります。 たとえば、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
整数を変換する場合、データ型とラップアラウンドの最大値を超える可能性があることに注意してください。
var big int64 = 129
var little = int8(big)
fmt.Println(little)
Output-127
値が小さすぎて保持できないデータ型に変換されると、ラップアラウンドが発生します。 前の例では、8ビットのデータ型 int8
64ビット変数を保持するのに十分なスペースがありませんでした big
. 大きな数値のデータ型から小さな数値のデータ型に変換するときは、誤ってデータを切り捨てないように常に注意する必要があります。
整数から浮動小数点数への変換
Goで整数をfloatに変換することは、ある整数型を別の型に変換することに似ています。 組み込みの型変換をラッピングして使用できます float64()
また float32()
変換する整数の周り:
var x int64 = 57
var y float64 = float64(x)
fmt.Printf("%.2f\n", y)
Output57.00
このコードは変数を宣言します x
タイプの int64
その値をに初期化します 57
.
var x int64 = 57
ラッピング float64()
周りの変換 x
の値を変換します 57
の浮動小数点値に 57.00
.
var y float64 = float64(x)
The %.2f
印刷動詞は言う fmt.Printf
浮動小数点を小数点以下2桁でフォーマットします。
このプロセスを変数で使用することもできます。 次のコードは宣言します f
に等しい 57
、次に新しいフロートを出力します。
var f float64 = 57
fmt.Printf("%.2f\n", f)
Output57.00
いずれかを使用して float32()
また float64()
、整数を浮動小数点数に変換できます。 次に、浮動小数点数を整数に変換する方法を学習します。
フロートを整数に変換する
Goはfloatを整数に変換できますが、プログラムはfloatの精度を失います。
浮きを包む 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
この構文はfloatを変換します 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は、floatの10進数と残りの数値を切り捨てて、整数を作成します。 390.8を391に切り上げたい場合でも、Goはこれを実行しないことに注意してください。 int()
タイプ。 代わりに、小数点が削除されます。
除算によって変換された数値
Goで整数型を除算すると、結果も整数型になり、モジュラスまたは余りが削除されます。
a := 5 / 2
fmt.Println(a)
Output2
除算するときに、数値タイプのいずれかがfloatである場合、すべてのタイプが自動的にfloatとして宣言されます。
a := 5.0 / 2
fmt.Println(a)
Output2.5
これはフロートを分割します 5.0
整数で 2
、そして答え 2.5
10進精度を保持するfloatです。
このセクションでは、さまざまなサイズの整数や浮動小数点数など、さまざまな数値データ型間で変換しました。 次に、数値と文字列の間で変換する方法を学習します。
文字列による変換
文字列は、1つ以上の文字(文字、数字、または記号)のシーケンスです。 文字列はコンピュータプログラムのデータの一般的な形式であり、特にユーザーが生成したデータを取り込む場合は、文字列を数値に変換したり、数値を文字列に変換したりする必要があります。
数値を文字列に変換する
を使用して数値を文字列に変換できます strconv.Itoa
からの方法 strconv
Go標準ライブラリのパッケージ。 メソッドの括弧に数値または変数を渡すと、その数値は文字列値に変換されます。
まず、整数の変換を見てみましょう。 整数を変換するには 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
あなたの変数に。 あなたも使用しました %q
動詞 fmt.Printf
関数。提供された文字列を引用するように関数に指示します。
変数を使用すると、整数を文字列に変換することがどれほど実用的であるかを理解し始めることができます。 ユーザーの毎日のプログラミングの進捗状況を追跡し、ユーザーが一度に書き込むコードの行数を入力しているとします。 このフィードバックをユーザーに表示し、文字列と整数の値を同時に出力します。
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
メソッド、から fmt
Go標準ライブラリのパッケージでは、floatの文字列値が返されます。 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.
連結はエラーなしで実行されたため、floatが適切に文字列に変換されたことを確認できます。
文字列を数値に変換する
文字列は、を使用して数値に変換できます strconv
Go標準ライブラリのパッケージ。 The 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()
メソッドは、変換されたタイプと潜在的なエラーの両方を返します。 から変換する場合 lines_yesterday
とともに strconv.Atoi
機能、あなたはチェックする必要があります 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のデータ型の詳細な分析が必要な場合は、Goのデータ型についての記事を確認してください。