Go言語 big.Int.Format()の代替手段:効率的な文字列変換テクニック
func (z *Int) Format(s fmt.State, c rune)
このメソッドの引数と戻り値、そして動作について詳しく見ていきましょう。
- 戻り値: このメソッドは何も返しません。その代わり、
fmt.State
のio.Writer
を通じて、フォーマットされた文字列を直接書き込みます。 c rune
: これは、書式設定の動詞(verb)を表す文字です。例えば、%d
のd
、%x
のx
、%o
のo
などです。big.Int
のFormat
メソッドは、主に以下の動詞をサポートします。'b'
または'B'
:バイナリ(基数2)形式'o'
または'O'
:8進数(基数8)形式'd'
または'D'
:10進数(基数10)形式'x'
または'X'
:16進数(基数16)形式'v'
:デフォルトの書式(通常は10進数)
s fmt.State
: これはio.Writer
インターフェースと、書式設定フラグ(例えば、%x
、%o
、%v
など)に関する情報を提供するメソッドのセットをカプセル化したものです。Format
メソッドが呼び出されると、Goのfmt
パッケージは内部的にこのfmt.State
オブジェクトを生成し、渡します。これを使って、結果の文字列をどこに書き込むか、またどのようなフラグが指定されているかを知ることができます。z *Int
: これは、フォーマットしたいbig.Int
型のポインタです。つまり、このメソッドはz
が指す大きな整数値をフォーマットします。
通常、big.Int.Format()
を直接呼び出すことはほとんどありません。fmt.Sprintf()
や fmt.Printf()
のような fmt
パッケージの関数を使うときに、big.Int
型の変数を書式指定子(%d
, %x
など)とともに渡すと、fmt
パッケージが内部的に big.Int
の Format
メソッドを呼び出して適切な書式設定を行います。
例
package main
import (
"fmt"
"math/big"
)
func main() {
// 大きな整数を定義
num := new(big.Int)
num.SetString("123456789012345678901234567890", 10) // 10進数で設定
// 10進数で出力
fmt.Printf("10進数: %d\n", num)
// 16進数で出力
fmt.Printf("16進数: %x\n", num)
// 8進数で出力
fmt.Printf("8進数: %o\n", num)
// バイナリで出力
fmt.Printf("バイナリ: %b\n", num)
// 'v' (デフォルト) で出力
fmt.Printf("デフォルト: %v\n", num)
// 幅指定やゼロ埋めなどのフラグも利用可能
fmt.Printf("ゼロ埋め16進数: %050x\n", num)
}
10進数: 123456789012345678901234567890
16進数: 1b6f0e0f316279c93393b3ef06
8進数: 3333607074306351475456667167606017206
バイナリ: 1101101101111000011100000111100110001011001111100100100110011001101100111110111100000110
デフォルト: 123456789012345678901234567890
ゼロ埋め16進数: 0000000000000000000000000001b6f0e0f316279c93393b3ef06
big.Int.Format()
はfmt.Printf
やfmt.Sprintf
のようなfmt
パッケージの関数がbig.Int
型の値をフォーマットする際に内部的に呼び出すメソッドです。そのため、直接的なエラーメッセージが表示されることは稀ですが、意図しない出力やパフォーマンスの問題が発生する可能性があります。
意図しない基数(進数)での出力
問題
big.Int
の値を表示した際に、期待していた10進数(%d
)ではなく、16進数(%x
)や8進数(%o
)で出力されてしまう。
原因
fmt
パッケージの書式指定子(フォーマット動詞)が間違っている。
トラブルシューティング
- %vの挙動を理解する
%v
はデフォルトの書式で、big.Int
の場合は通常10進数で出力されますが、状況によっては変わる可能性も考慮に入れるべきです。明示的に基数を指定するのが最も安全です。 - %bを使用する
バイナリ(2進数)で表示したい場合は、%b
を使用します。 - %oを使用する
8進数で表示したい場合は、%o
または%O
を使用します。 - %xを使用する
16進数で表示したい場合は、%x
または%X
を使用します。 - %dを使用する
10進数で表示したい場合は、必ず%d
を使用します。
例
package main
import (
"fmt"
"math/big"
)
func main() {
num := new(big.Int)
num.SetString("12345", 10)
// 良い例:意図した10進数で出力
fmt.Printf("10進数: %d\n", num) // 出力: 10進数: 12345
// 悪い例:意図せず16進数で出力
fmt.Printf("16進数: %x\n", num) // 出力: 16進数: 3039
}
大量の数値出力によるパフォーマンスの低下
問題
非常に大きなbig.Int
の値を大量にフォーマットして出力すると、プログラムの実行速度が著しく低下する。
原因
big.Int.Format()
(およびそれが利用する内部処理)は、大きな数値を文字列に変換するために計算リソースとメモリを消費します。大量の変換を行うと、そのオーバーヘッドが顕著になります。
トラブルシューティング
- 基数変換の回数を減らす
多くのbig.Int
のフォーマットが同じ基数(例: 10進数)で行われるのであれば、一度文字列に変換したものを再利用できないか検討します。 - String()メソッドを直接利用する
big.Int
にはString()
メソッドがあり、これはFormat
メソッドの内部的な処理の一部を簡略化したものと考えることができます。単純に10進数文字列が必要な場合は、String()
メソッドを直接呼び出す方が若干効率が良い場合があります。str := num.String() // numの10進数表現文字列を取得 fmt.Println(str)
- 必要な場合のみフォーマットする
デバッグ目的などで一時的に大きな数値を文字列化しているのであれば、本番環境ではその出力を減らすか、完全に削除することを検討します。
不適切なゼロ値の扱い
問題
初期化されていないbig.Int
(ゼロ値)をフォーマットすると、期待通りの「0」ではなく、空文字列や予期しない出力になることがある。
原因
big.Int
のゼロ値はnil
ポインタではなく、値が0のbig.Int
構造体です。しかし、new(big.Int)
で初期化せずにそのまま使用したり、誤ってnil
の*big.Int
を渡したりすると問題が発生する可能性があります。
トラブルシューティング
- nilポインタのチェック
*big.Int
を関数に渡す場合など、ポインタがnil
でないことを確認することが重要です。fmt
パッケージはnil
のbig.Int
ポインタを適切に処理しようとしますが、予期せぬ挙動を避けるために、自分でチェックする方が安全です。 - 必ず初期化する
new(big.Int)
またはbig.NewInt(0)
などで明示的に初期化してから使用します。big.Int
のゼロ値は0
を意味するため、通常は問題ありませんが、混乱を避けるためにも初期化の習慣をつけるのが良いでしょう。
例
package main
import (
"fmt"
"math/big"
)
func main() {
// 初期化されていないbig.Int (ゼロ値は0)
var num1 big.Int
fmt.Printf("初期化されていないbig.Int: %d\n", &num1) // 出力: 0
// newで初期化 (これも0)
num2 := new(big.Int)
fmt.Printf("newで初期化されたbig.Int: %d\n", num2) // 出力: 0
// big.NewIntで初期化
num3 := big.NewInt(0)
fmt.Printf("big.NewInt(0)で初期化されたbig.Int: %d\n", num3) // 出力: 0
// 誤ってnilポインタを渡す場合 (これはパニックを引き起こす可能性は低いが、出力が期待通りでない場合がある)
var num4 *big.Int // nil ポインタ
fmt.Printf("nilポインタのbig.Int: %v\n", num4) // 出力: <nil>
// 実際にはfmtパッケージがnilポインタのレシーバを持つFormatメソッドを呼び出すことはありません。
// fmt.Printfがnilインターフェースを処理する際の挙動です。
}
big.Int.Format()
は*Int
レシーバーを持つため、nil
ポインタに対して直接Format()
を呼び出すとランタイムパニックが発生します。しかし、fmt.Printf("%v", nilBigIntPointer)
のように fmt
パッケージの関数にnil
の*big.Int
を渡した場合、fmt
パッケージが内部でnil
インターフェースを適切に処理するため、パニックにはならず、<nil>
と出力されます。これはFormat
メソッドが呼び出される前に処理されているためです。
big.Intの内部表現の理解不足
問題
big.Int
の内部データ構造(例:neg
フィールドやabs
フィールド)を直接見ようとして、fmt.Printf("%v", num)
とした際に、期待通りの数値ではなく、{false [12345]}
のような出力になる。
原因
big.Int
はポインタ型(*big.Int
)としてfmt
パッケージに渡されると、そのString()
メソッドが呼び出され、整形された文字列が返されます。しかし、big.Int
の値(ポインタではない)を直接%v
などでフォーマットしようとすると、構造体の内部表現がそのまま出力されることがあります。
トラブルシューティング
- 常にポインタとして渡す
big.Int
の変数は、常にポインタ(*big.Int
)としてfmt.Printf
などに渡すようにします。big.NewInt
やnew(big.Int)
はポインタを返すので、そのポインタ変数をそのまま渡せば問題ありません。
例
package main
import (
"fmt"
"math/big"
)
func main() {
// 推奨される方法: ポインタとして渡す
numPtr := big.NewInt(123)
fmt.Printf("ポインタとして渡す: %v\n", numPtr) // 出力: 123
// 非推奨: 値として渡す(内部構造が見えてしまう)
// numVal := *numPtr // numPtrの指す値をコピー
// fmt.Printf("値として渡す: %v\n", numVal) // 出力: {false [123]} (またはこれに類する形式)
// ↑これは `big.Int` が `String()` メソッドをポインタレシーバで実装しているため、
// `big.Int` の「値」を直接 `fmt` に渡すと `String()` メソッドが呼ばれず、
// 構造体の中身が表示されてしまうためです。
// 通常、`big.Int` は常にポインタで扱われます。
}
書式指定子の非互換性や未サポートのフラグ
問題
Goの通常の数値型では使える特定の書式指定子(例:符号の強制表示 %+d
やスペース埋め %-d
など)が、big.Int
で期待通りに機能しない、またはエラーになる。
原因
big.Int.Format()
は、fmt.Formatter
インターフェースを実装していますが、すべてのfmt
書式指定子やフラグを完全にサポートしているわけではありません。特に、big.Int
の特性上、浮動小数点数向けの書式などは適用できません。
- 手動での調整を検討する
もし特定の複雑な書式が必要で、Format()
が直接サポートしていない場合は、一度文字列に変換した後に、strings
パッケージの関数などを使って手動で調整することを検討します。 - math/bigパッケージのドキュメントを確認する
big.Int.Format()
が具体的にどのフォーマット動詞(c rune
)とフラグをサポートしているか、math/big
パッケージの公式ドキュメント(go doc math/big
)を確認します。
基本的な書式設定 (Basic Formatting)
最も一般的な使い方です。big.Int
の値を様々な基数で出力します。
package main
import (
"fmt"
"math/big"
)
func main() {
// 大きな整数を定義
num := new(big.Int)
num.SetString("123456789012345678901234567890", 10) // 10進数文字列から設定
fmt.Println("--- 基本的な書式設定 ---")
// %d: 10進数 (Decimal)
fmt.Printf("10進数: %d\n", num)
// %x: 16進数 (Hexadecimal) - 小文字
fmt.Printf("16進数(小文字): %x\n", num)
// %X: 16進数 (Hexadecimal) - 大文字
fmt.Printf("16進数(大文字): %X\n", num)
// %o: 8進数 (Octal) - 小文字 (大文字も同様)
fmt.Printf("8進数: %o\n", num)
// %b: 2進数 (Binary)
fmt.Printf("2進数: %b\n", num)
// %v: デフォルトの書式 (通常は10進数)
fmt.Printf("デフォルト (%v): %v\n", num, num) // 最初の%vは文字列としてnumを表示
}
出力例
--- 基本的な書式設定 ---
10進数: 123456789012345678901234567890
16進数(小文字): 1b6f0e0f316279c93393b3ef06
16進数(大文字): 1B6F0E0F316279C93393B3EF06
8進数: 3333607074306351475456667167606017206
2進数: 1101101101111000011100000111100110001011001111100100100110011001101100111110111100000110
デフォルト (%v): 123456789012345678901234567890
書式設定フラグの使用 (Using Formatting Flags)
fmt
パッケージでは、幅、ゼロ埋め、符号の表示など、様々なフラグをサポートしています。これらはbig.Int.Format()
によって適切に解釈され、出力に反映されます。
package main
import (
"fmt"
"math/big"
)
func main() {
numPos := big.NewInt(12345)
numNeg := big.NewInt(-6789)
numZero := big.NewInt(0)
fmt.Println("\n--- 書式設定フラグの使用 ---")
// %w: 最小フィールド幅 (wは幅)
fmt.Printf("幅10 (正): '%10d'\n", numPos) // 右寄せ、左側をスペースで埋める
fmt.Printf("幅10 (負): '%10d'\n", numNeg)
// %0w: ゼロ埋め (wは幅)
fmt.Printf("幅10 ゼロ埋め (正): '%010d'\n", numPos) // 右寄せ、左側をゼロで埋める
fmt.Printf("幅10 ゼロ埋め (負): '%010d'\n", numNeg)
// %+d: 常に符号を表示
fmt.Printf("符号表示 (正): %+d\n", numPos)
fmt.Printf("符号表示 (負): %+d\n", numNeg)
fmt.Printf("符号表示 (ゼロ): %+d\n", numZero)
// % d: 負の数には符号、正の数とゼロにはスペースを表示
fmt.Printf("スペース符号 (正): % d\n", numPos)
fmt.Printf("スペース符号 (負): % d\n", numNeg)
fmt.Printf("スペース符号 (ゼロ): % d\n", numZero)
// %#x: 接頭辞 (0x) を表示 (16進数、8進数、2進数で有効)
fmt.Printf("16進数接頭辞: %#x\n", numPos) // "0x" がつく
fmt.Printf("8進数接頭辞: %#o\n", numPos) // "0" がつく
fmt.Printf("2進数接頭辞: %#b\n", numPos) // "0b" がつく (Go 1.13以降)
// %-w: 左寄せ
fmt.Printf("左寄せ10 (正): '%-10d'\n", numPos)
fmt.Printf("左寄せ10 (負): '%-10d'\n", numNeg)
}
出力例
--- 書式設定フラグの使用 ---
幅10 (正): ' 12345'
幅10 (負): ' -6789'
幅10 ゼロ埋め (正): '0000012345'
幅10 ゼロ埋め (負): '-00006789'
符号表示 (正): +12345
符号表示 (負): -6789
符号表示 (ゼロ): +0
スペース符号 (正): 12345
スペース符号 (負): -6789
スペース符号 (ゼロ): 0
16進数接頭辞: 0x3039
8進数接頭辞: 030071
2進数接頭辞: 0b11000000111001
左寄せ10 (正): '12345 '
左寄せ10 (負): '-6789 '
fmt.Sprintf を使って文字列として取得 (Getting String with fmt.Sprintf)
fmt.Sprintf
を使うと、フォーマットされた結果を直接文字列として取得できます。ファイルへの書き込みや、他の文字列との結合などに便利です。
package main
import (
"fmt"
"math/big"
)
func main() {
val := big.NewInt(123456789)
fmt.Println("\n--- fmt.Sprintf を使って文字列として取得 ---")
// 10進数文字列として取得
decimalStr := fmt.Sprintf("この値は %d です。", val)
fmt.Println(decimalStr)
// 16進数文字列として取得
hexStr := fmt.Sprintf("この値の16進数は %X です。", val)
fmt.Println(hexStr)
// 複数の big.Int をフォーマット
anotherVal := big.NewInt(987654321)
combinedStr := fmt.Sprintf("値1: %d, 値2: %d", val, anotherVal)
fmt.Println(combinedStr)
}
出力例
--- fmt.Sprintf を使って文字列として取得 ---
この値は 123456789 です。
この値の16進数は 75BCD15 です。
値1: 123456789, 値2: 987654321
big.Int
にはString()
メソッドも存在します。これは、Format()
が内部的に使用する場合がありますが、String()
は常に10進数文字列を返します。特定の基数での出力が必要な場合はFormat()
(またはfmt
パッケージ)を使用し、単純に10進数文字列が必要な場合はString()
を使用するのが一般的です。
package main
import (
"fmt"
"math/big"
)
func main() {
num := big.NewInt(1234567890)
fmt.Println("\n--- big.Int.String() との比較 ---")
// big.Int.String() を使用
strFromBigInt := num.String()
fmt.Printf("String() メソッド: %s (常に10進数)\n", strFromBigInt)
// fmt.Sprintf を使用して10進数
strFromSprintfD := fmt.Sprintf("%d", num)
fmt.Printf("fmt.Sprintf(%%d): %s\n", strFromSprintfD)
// fmt.Sprintf を使用して16進数
strFromSprintfX := fmt.Sprintf("%x", num)
fmt.Printf("fmt.Sprintf(%%x): %s\n", strFromSprintfX)
// String() と fmt.Sprintf("%d") は通常同じ結果
fmt.Printf("String() と fmt.Sprintf(\"%%d\") は同じか: %t\n", strFromBigInt == strFromSprintfD)
}
--- big.Int.String() との比較 ---
String() メソッド: 1234567890 (常に10進数)
fmt.Sprintf(%d): 1234567890
fmt.Sprintf(%x): 499602d2
String() と fmt.Sprintf("%d") は同じか: true
主な代替方法は以下の通りです。
big.Int.String()
メソッド: 10進数文字列として取得する場合big.Int.Text(base int)
メソッド: 任意の基数(進数)の文字列として取得する場合big.Int.Format()
の直接呼び出し (稀なケース): カスタムのfmt.State
とrune
を生成して呼び出す。big.Int
の値を直接操作して文字列を構築する: 非常に特殊な、低レベルな制御が必要な場合。
それぞれの方法について詳しく見ていきましょう。
big.Int.String() メソッド
これはbig.Int
を最も簡単に10進数文字列に変換する方法です。Format()
メソッドと異なり、引数を持たず、常に10進数表現を返します。
特徴
- 戻り値:
string
- 基数固定: 常に10進数。
- シンプルさ: 非常に使いやすい。
ユースケース
- 数値の10進数表現をファイルに書き込む、またはネットワーク経由で送信する場合。
- デバッグ出力で簡単に10進数を見たい場合。
例
package main
import (
"fmt"
"math/big"
)
func main() {
num := new(big.Int)
num.SetString("987654321098765432109876543210", 10)
fmt.Println("--- big.Int.String() メソッド ---")
// String() メソッドを使って10進数文字列を取得
s := num.String()
fmt.Printf("num.String(): %s\n", s)
// 負の数の場合も対応
negNum := big.NewInt(-123456789)
fmt.Printf("negNum.String(): %s\n", negNum.String())
}
出力例
--- big.Int.String() メソッド ---
num.String(): 987654321098765432109876543210
negNum.String(): -123456789
big.Int.Text(base int) メソッド
big.Int.Text(base int)
メソッドは、指定された基数(2から62まで)でbig.Int
を文字列に変換します。これは、Format()
で%x
や%b
のように基数を指定するのと同等の機能を提供しますが、fmt
パッケージの書式設定フラグ(幅、ゼロ埋めなど)は適用されません。
特徴
- 戻り値:
string
- シンプル:
fmt
パッケージの複雑な書式設定オプションが不要な場合。 - 任意の基数: 2から62までの基数を指定可能。
ユースケース
- 基数変換のパフォーマンスが重要で、
fmt
パッケージのオーバーヘッドを避けたい場合(ただし、大きな違いはごく稀なケースでしか現れません)。 - より高レベルのAPIを呼び出す前に、特定の基数で文字列表現を生成したい場合。
big.Int
の16進数、8進数、または2進数表現のみが必要で、書式フラグが不要な場合。
例
package main
import (
"fmt"
"math/big"
)
func main() {
num := big.NewInt(123456789)
fmt.Println("\n--- big.Int.Text(base int) メソッド ---")
// 10進数
fmt.Printf("num.Text(10): %s\n", num.Text(10))
// 16進数
fmt.Printf("num.Text(16): %s\n", num.Text(16))
// 8進数
fmt.Printf("num.Text(8): %s\n", num.Text(8))
// 2進数
fmt.Printf("num.Text(2): %s\n", num.Text(2))
// 負の数の16進数 (符号は先頭に付く)
negNum := big.NewInt(-123456789)
fmt.Printf("negNum.Text(16): %s\n", negNum.Text(16))
// 基数62 (0-9, a-z, A-Z を使用)
largeNum := big.NewInt(0)
largeNum.SetString("12345678901234567890", 10)
fmt.Printf("largeNum.Text(62): %s\n", largeNum.Text(62))
}
出力例
--- big.Int.Text(base int) メソッド ---
num.Text(10): 123456789
num.Text(16): 75bcd15
num.Text(8): 72671505
num.Text(2): 111010110111100110100010101
negNum.Text(16): -75bcd15
largeNum.Text(62): 3Q5n9s8x9s2f5p
big.Int.Format() の直接呼び出し (非常に稀なケース)
big.Int.Format()
は、fmt.State
とrune
を引数に取ります。これは、通常fmt
パッケージが内部で生成して渡すものです。特別な理由がない限り、開発者がこれを直接呼び出すことはありません。
ただし、fmt.State
インターフェースをモックしたり、非常にカスタムなロガーやシリアライザーを構築する場合など、極めて稀なケースでは、このメソッドのシグネチャを理解し、その動作を模倣する必要があるかもしれません。
fmt.Stateの主なメソッド
Flag(char int) bool
: 特定の書式フラグが設定されているかチェック(例:fmt.FlagPlus
、fmt.FlagSpace
、fmt.FlagSharp
、fmt.FlagZero
、fmt.FlagMinus
)。Precision() (prec int, ok bool)
: 精度を取得。Width() (wid int, ok bool)
: フィールド幅を取得。Write(b []byte) (n int, err error)
: フォーマットされたバイトを書き込む。
特徴
- 複雑:
fmt.State
インターフェースを理解し、正しく実装する必要がある。 - 低レベルな制御:
fmt
パッケージが行う内部処理を模倣または拡張する場合にのみ有用。
ユースケース
- テストのために
fmt.State
をモックしたい場合。 - カスタムの書式設定ロジックを実装するGoの低レベルライブラリ開発者。
例 (概念的なもの、通常は行わない)
package main
import (
"bytes"
"fmt"
"math/big"
"strings"
)
// MyState は fmt.State インターフェースの簡易的な実装
type MyState struct {
buf bytes.Buffer
flags map[int]bool
width int
prec int
}
func (s *MyState) Write(b []byte) (n int, err error) {
return s.buf.Write(b)
}
func (s *MyState) Width() (wid int, ok bool) { return s.width, s.width != 0 }
func (s *MyState) Precision() (prec int, ok bool) { return s.prec, s.prec != 0 }
func (s *MyState) Flag(char int) bool { return s.flags[char] }
func main() {
num := big.NewInt(12345)
fmt.Println("\n--- big.Int.Format() の直接呼び出し (概念的) ---")
// カスタムの fmt.State を作成
state := &MyState{
flags: make(map[int]bool),
width: 10, // 幅10を設定
prec: 0,
}
state.flags['0'] = true // ゼロ埋めフラグを設定
// Format メソッドを直接呼び出す (通常は行わない)
num.Format(state, 'd') // 10進数 ('d') でフォーマット
fmt.Printf("直接Format呼び出し結果 (10進数、ゼロ埋め): %s\n", state.buf.String())
// 16進数
stateHex := &MyState{
flags: make(map[int]bool),
width: 0,
prec: 0,
}
stateHex.flags['#'] = true // 接頭辞フラグを設定
num.Format(stateHex, 'x')
fmt.Printf("直接Format呼び出し結果 (16進数、接頭辞): %s\n", stateHex.buf.String())
}
出力例
--- big.Int.Format() の直接呼び出し (概念的) ---
直接Format呼び出し結果 (10進数、ゼロ埋め): 0000012345
直接Format呼び出し結果 (16進数、接頭辞): 0x3039
注意: 上記のMyState
の実装は非常に簡略化されており、すべてのfmt.State
の動作を完全に模倣しているわけではありません。これはbig.Int.Format
がどのように動作するかを示すための概念的な例です。
これは最も低レベルな方法で、通常は推奨されません。big.Int
の内部表現(abs
スライスやneg
フラグなど)を直接読み取り、それらから自分で文字列を構築する方法です。math/big
パッケージのソースコードを深く理解しているか、非常に特殊なパフォーマンス要件がある場合にのみ検討されます。
特徴
- 低パフォーマンスリスク: ほとんどの場合、自分で実装するよりもパッケージのメソッドの方が最適化されている。
- 最高の複雑さ:
big.Int
の内部実装に依存し、将来のGoのバージョンで壊れる可能性がある。 - 最高の制御: 完全にカスタマイズされたフォーマットロジック。
ユースケース
big.Int
の内部構造を研究する場合。- 既存のGoのライブラリやツールが提供するフォーマットが全く合わず、かつパフォーマンスが極めて重要な特殊なシステムを構築する場合。
この方法は複雑でエラーを起こしやすいため、具体的なコード例は割愛します。これは、big.Int
のFormat()
、String()
、Text()
、そしてfmt
パッケージの機能が、ほとんどすべての一般的なユースケースをカバーしていることを示唆しています。
big.Int.Format()
の代替手段として、最も実用的で推奨されるのは以下の2つです。
big.Int.Text(base int)
: 任意の基数での文字列が欲しい場合。big.Int.String()
: 10進数文字列が欲しい場合。