Go言語では、文字列を整数に変換する効率的な方法がいくつか提供されています。これは様々なプログラミングシナリオでよくあるタスクです。この記事では3つの主要なアプローチを探り、それぞれの長所と短所を強調することで、特定のニーズに最適な方法を選択するのに役立てます。
目次
1. strconv.Atoi()
strconv.Atoi()
関数は、10進数の文字列を整数に変換する簡潔な方法を提供します。そのシンプルさから、単純な変換に最適です。
package main
import (
"fmt"
"strconv"
)
func main() {
str := "12345"
num, err := strconv.Atoi(str)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Integer:", num)
}
}
この関数は、変換された整数とエラー値の両方を返します。入力文字列が有効な整数でない場合を処理するために、常にエラーをチェックしてください。
2. strconv.ParseInt()
より柔軟な整数変換のために、strconv.ParseInt()
を使用すると、基数(radix)と目的の整数サイズ(例:int32、int64)を指定できます。
package main
import (
"fmt"
"strconv"
)
func main() {
str := "1A"
num, err := strconv.ParseInt(str, 16, 64) // 16進数、64ビット整数
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Integer:", num)
}
str2 := "101101"
num2, err := strconv.ParseInt(str2, 2, 64) // 2進数、64ビット整数
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Integer:", num2)
}
}
この例では、16進数と2進数の文字列を変換する方法を示しています。2番目の引数は基数を設定し、3番目の引数は結果の整数のビットサイズを指定します。エラー処理は依然として重要です。
3. fmt.Sscanf()
fmt.Sscanf()
は、文字列解析に対するより一般的なアプローチを提供し、複雑な文字列形式を扱う場合に役立ちます。しかし、単純な整数変換の場合、strconv
関数よりも効率が悪いことがよくあります。
package main
import (
"fmt"
)
func main() {
str := "Value: 12345"
var num int
_, err := fmt.Sscanf(str, "Value: %d", &num)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Integer:", num)
}
}
フォーマット文字列 “Value: %d” は、文字列がどのように解析されるかを決定します。%d
は、num
変数に抽出され格納される整数を意味します。この方法は構造化されたデータの解析に強力ですが、単純な整数変換には複雑さを加えます。
4. メソッドの比較
適切な方法の選択は、特定のニーズによって異なります。
メソッド | 基数のサポート | ビットサイズ制御 | エラー処理 | シンプルさ | ユースケース |
---|---|---|---|---|---|
strconv.Atoi() |
10進数のみ | なし | あり | 高い | 単純な10進数変換 |
strconv.ParseInt() |
可変 | あり | あり | 中程度 | 柔軟な基数とビットサイズ |
fmt.Sscanf() |
可変 | あり | あり | 低い | 複雑な文字列解析 |
基本的な10進数変換の場合、strconv.Atoi()
は最もシンプルで効率的です。strconv.ParseInt()
は、異なる基数と整数サイズに対してより大きな柔軟性を提供します。fmt.Sscanf()
は、より複雑な文字列構造から整数を抽出する場合に最適です。