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 サイトの他の関連記事を参照してください。