ホームページ > バックエンド開発 > Golang > `fmt.Fscan()` を使用して Go スライスに複数の数値を効率的に読み取るにはどうすればよいですか?

`fmt.Fscan()` を使用して Go スライスに複数の数値を効率的に読み取るにはどうすればよいですか?

DDD
リリース: 2024-11-25 06:44:15
オリジナル
944 人が閲覧しました

How Can I Efficiently Read Multiple Numbers into a Go Slice Using `fmt.Fscan()`?

Go での標準入力からの数値の解析

複数の数値入力を扱う場合、Go では開発者が複数の変数を使用して個々の値を取得できます。ただし、このプロセスを簡素化し、すべての数値を 1 つの配列またはスライスに保存したい場合はどうすればよいでしょうか?

次のコード スニペットを考えてみましょう:

numbers := make([]int, 2)
fmt.Fscan(os.Stdin, &numbers[0], &numbers[1])
ログイン後にコピー

このコードは、2 つの数値を効率的に読み取り、保存します。それらを数字のスライスに含めます。ただし、入力の数が多い場合、このアプローチは冗長になる可能性があります。

fmt.Fscan() を使用して数値をスライスに直接読み取ることができますか?

残念ながら、fmt パッケージはスライスへのスキャンをネイティブにサポートしていません。この制限を克服するには、すべてのスライス要素のアドレスをインターフェイスの配列にパックするカスタム ユーティリティ関数を作成できます。

func packAddrs(n []int) []interface{} {
    p := make([]interface{}, len(n))
    for i := range n {
        p[i] = &n[i]
    }
    return p
}
ログイン後にコピー

この関数はスライスを反復処理して、各要素へのポインターの配列を作成します。 .

packAddrs() 関数を使用してスライスをスキャンします

numbers := make([]int, 2)
n, err := fmt.Fscan(os.Stdin, packAddrs(numbers)...)
fmt.Println(numbers, n, err)
ログイン後にコピー

packAddrs() 関数は、スライスをインターフェイスの配列に変換し、fmt.Fscan() が各要素をスキャンできるようにします。

fmt.Sscan() を使用した例testing

numbers := make([]int, 5)
n, err := fmt.Sscan("1 3 5 7 9", packAddrs(numbers)...)
fmt.Println(numbers, n, err)
ログイン後にコピー

この例では、fmt.Sscan() を使用してコードをテストしています。文字列を入力として受け取り、スキャンされた値を返します。このコードの出力は次のとおりです。

[1 3 5 7 9] 5 <nil>
ログイン後にコピー

これは、packAddrs() ユーティリティ関数を使用して複数の数値をスライスに効率的に読み取る方法を示しています。

以上が`fmt.Fscan()` を使用して Go スライスに複数の数値を効率的に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート