package main
import (
"fmt"
"os"
"bufio"
)
var counter int = 0
func main() {
var (
read1 *bufio.Scanner;
)
read1 = bufio.NewScanner(os.Stdin);
read2 := read1
count_lines(read1)
read2.Scan()
fmt.Println("read2: ", read2.Text())
os.Exit(0);
}
func count_lines(read *bufio.Scanner){
read.Scan();
fmt.Println("read1: ", read.Text())
if read.Text() == ""{
return;
}
counter ;
count_lines(read);
}
因此,我正在嘗試使用遞回計算用戶輸入的行數。而且我還想在不同的函式中處理相同的輸入。但是當我使用 Scan() 時,它會逐行決議輸入。read2 變數為空。有沒有辦法正確復制用戶輸入?如果我不能正確解釋,我很抱歉。我是 Go 的新手,我什么都不懂。我附上了一張圖片供參考。 參考 謝謝。
uj5u.com熱心網友回復:
歡迎使用 StackOverflow,開始吧!
我將嘗試以一種希望可以理解的方式來解釋這種情況,但技術上不一定準確。因此,為了從鍵盤讀取輸入,您使用的是您“命名”的“掃描儀” read1:
read1 = bufio.NewScanner(os.Stdin)
然后你“復制”那個“掃描儀”并命名它 read2
read2 := read1
所以現在當你count_lines用read1掃描儀打電話時,你會計算行數,直到輸入一個空行。然后,您假設完成行計數后,read2將能夠再次讀取相同的行。但這不是它的作業原理。
以下內容可以更好地說明實際發生的情況。想象一下,read1和read2兩個鎬??,你可以用它來挖東西掉在了地上。所以你拿起一個你親切命名的鎬read1并擊中地面(這等于read.Scan())。然后你拿起你得到的那一塊并檢查里面是什么(read.Text())。然后,您重復該程序,直到完成鎬或直到 - read.Text() == ""。
當你完成后,你把 ?? 命名為read2......你不能再挑同樣的事情了,對吧?這基本上就是掃描儀的作業方式。
因此,要處理它,您可以對自己說,我不需要兩把鎬,一個就足夠了,但是無論我從地上挖掘出什么,我都想保留并首先對其進行分析以獲取鉆石(count_lines),然后再進行第二次分析以獲取黃金(或任何你喜歡的)。
所以你的代碼可能看起來像:
package main
import (
"fmt"
"os"
"bufio"
)
var counter int = 0
var myLines = ""
func main() {
var (
read1 *bufio.Scanner;
)
read1 = bufio.NewScanner(os.Stdin);
count_lines(read1)
fmt.Println("read2: ");
fmt.Println(myLines)
os.Exit(0);
}
func count_lines(read *bufio.Scanner) {
read.Scan();
line := read.Text();
myLines = line "\n";
fmt.Println("read1: ", line)
if read.Text() == ""{
return;
}
counter ;
count_lines(read);
}
注意:這不是慣用的(推薦的)做事方式。我的目標是盡可能少地更改原始代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358275.html
標籤:走
下一篇:在wasm構建中使用可選引數
