首頁  >  文章  >  後端開發  >  如何使用scan方法實現控制台輸入

如何使用scan方法實現控制台輸入

PHPz
PHPz原創
2023-04-11 09:13:34868瀏覽

在Go語言中,可以使用scan方法從標準輸入讀取資料。 scan方法可以讀取任意類型的數據,包括字串、數字、布林值等等。本文將詳細介紹如何使用scan方法實現控制台輸入。

基本語法

scan方法的基本語法如下:

func Scan(a ...interface{}) (n int, err error)

從輸入中讀取數據,並將其儲存到指定的參數中。參數a表示需要讀取的數據,可以傳遞任一參數,每個參數都是指標類型,用於儲存輸入的資料。傳回值n表示成功讀取的參數個數,傳回值err表示可能出現的錯誤。

下面是一個簡單的例子,示範如何從控制台中讀取兩個整數:

func main() {
    var a, b int
    fmt.Print("请输入两个整数:")
    n, err := fmt.Scan(&a, &b)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("成功读取了 %d 个参数:%v\n", n, []int{a, b})
}

透過上面的程式碼,我們可以看到Scan方法的基本用法。執行上面的程式碼,程式將提示使用者輸入兩個整數,使用者輸入完成後,程式會將這兩個整數儲存到變數ab中,並輸出這兩個整數。

scan的特性

Scan方法有以下幾個特性:

1. 忽略空格

##Scan方法在讀取資料時,會自動忽略掉資料之間的空格。如下面的程式碼所示:

func main() {
    var a, b, c string
    fmt.Print("请输入三个字符串:")
    n, err := fmt.Scan(&a, &b, &c)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("成功读取了 %d 个参数:%v\n", n, []string{a, b, c})
}
輸入字串

hello world go,程式將自動忽略掉字串之間的空格,並輸出這三個字串。

2. 等待回車

Scan方法在讀取資料時,會等待使用者輸入回車符號\n,表示輸入完成。如果使用者沒有輸入回車符,程式將一直等待使用者輸入。如下面的程式碼所示:

func main() {
    var s string
    fmt.Print("请输入一个字符串:")
    n, err := fmt.Scan(&s)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("成功读取了 %d 个参数:%v\n", n, s)
}
輸入字串

hello後,程式並不會立即輸出結果,而是等待使用者輸入回車符號\n ,才會輸出結果。

3. 不會讀取換行符號

Scan方法在讀取資料時,不會讀取輸入中的換行符號\n。例如,當我們透過Scan方法讀取一個字串時,輸入字串中的換行符號\n不會被讀取。如下面的程式碼所示:

func main() {
    var s string
    fmt.Print("请输入一个字符串:")
    n, err := fmt.Scan(&s)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("成功读取了 %d 个参数:%v\n", n, s)
}
輸入字串

hello\nworld,程式只會讀取到字串hello,不會讀取到字串中的換行符號\n

深入分析

Scan方法的實作是基於fmt套件的Scanf函數。 Scanf方法有以下功能:

1. 格式化輸入

Scanf方法支援格式化輸入。可以透過格式化字串指定需要讀取的資料類型。例如,我們可以透過以下格式化字串讀取一個整數和一個字串:

func main() {
    var a int
    var b string
    fmt.Print("请输入一个整数和一个字符串:")
    n, err := fmt.Scanf("%d %s", &a, &b)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("成功读取了 %d 个参数:%v\n", n, []interface{}{a, b})
}
上面的程式碼中,定義的格式化字串

"%d %s"表示先讀取一個整數,再讀取一個字串,中間用空格分隔。

2. 自訂分隔符號

Scanf方法支援自訂分隔符號。預設情況下,Scanf方法以空格作為分隔符號。可以透過Scanf方法的ScanState參數,自訂分隔符號。如下面的程式碼所示:

func main() {
    var a, b string
    fmt.Print("请输入两个字符串,用逗号分隔:")
    s := bufio.NewScanner(os.Stdin)
    s.Split(func(data []byte, atEOF bool) (adv int, token []byte, err error) {
        for i := 0; i < len(data); i++ {
            if data[i] == ',' {
                return i + 1, data[:i], nil
            }
        }
        return 0, data, bufio.ErrFinalToken
    })
    if s.Scan() {
        a = s.Text()
    }
    if s.Scan() {
        b = s.Text()
    }
    fmt.Printf("您输入的字符串是:%v\n", []string{a, b})
}
上面的程式碼中,我們透過

bufio套件的NewScanner方法建立一個Scanner對象,並透過Split方法自訂了分隔符號。在分隔函數中,我們將逗號作為分隔符,以解析輸入字串,並將其儲存到變數ab

總結

透過本文的介紹,我們了解了

Scan方法的基本語法、特性以及如何實現控制台輸入。需要注意的是,Scan方法在處理輸入時,不會將換行符號\n讀取到輸入中。另外,Scanf方法支援自訂分隔符號和格式化輸入,可以更靈活地處理控制台輸入。

以上是如何使用scan方法實現控制台輸入的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn