沙滩星空的博客沙滩星空的博客

Go读取控制台输入

fmt包

fmt.Scan

package main

import "fmt"

func main() {
        var a1 int
        var a2 string

        n, err := fmt.Scan(&a1, &a2)
        fmt.Println("n = ", n)
        fmt.Println("err = ", err)
        fmt.Println("a = ", a1)
        fmt.Println("b = ", a2)
}

如上所示: 第一个参数为数字,第二个参数字符串或数字,中间用空格换行分开

fmt.Scanf

package main

import "fmt"

func main() {
    var a string

    n, err := fmt.Scanf("%s", &a) // afdsfdsfdsfds

    fmt.Println("n = ", n)     // n =  1
    fmt.Println("err = ", err) // err =  <nil>
    fmt.Println("a = ", a)     // a =  afdsfdsfdsfds
}

同样,Scanf也可以接收多个参数,但是接收字符串的话,只能在最后接收;
否则按照"%s%d"的格式进行接收,无论输入多少字符(包含数字),都会被认定是第一个字符串的内容,不会被第二个参数所接收。

fmt.Scanln

package main

import "fmt"

func main() {
    var a string
    var b string

    n, err := fmt.Scanln(&a, &b)

    fmt.Println("n = ", n)
    fmt.Println("err = ", err)
    fmt.Println("a = ", a)
    fmt.Println("b = ", b)
}

fmt.Scan的区别:如果设置接收2个参数,Scan在输入一个参数后进行回车,会继续等待第二个参数的键入;而Scanln直接认定输入了一个参数就截止了,只会接收一个参数并产生error(unexpected newline),且n = 1。

Scanln认定回车标志着【阻塞接收参数】结束,而Scan认定回车只是一个分隔符(或空白)而已。

bufio包

ReadByte

用来接收一个byte类型,会阻塞等待键盘输入。

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {

    reader := bufio.NewReader(os.Stdin)

    n, err := reader.ReadByte() // a

    fmt.Println("n = ", n)             // n =  97
    fmt.Println("string =", string(n)) // string = a
    fmt.Println("err = ", err)         // err =  <nil>

}

ReadBytes

输入参数为一个byte字符,当输入遇到该字符,会停止接收并返回。
接收的内容包括该停止字符以及前面的内容

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {

    reader := bufio.NewReader(os.Stdin)

    n, err := reader.ReadBytes('\n')

    fmt.Println("n = ", n)
    fmt.Println("string =", string(n))
    fmt.Println("err = ", err)

}

bufio.Reader 可以接收 包含空格内容的字符串,而不进行分割,这是与 fmt 包的一大不同。

ReadLine

ReadLine是一个低水平的行数据读取原语。大多数调用者应使用 ReadBytes('\n')ReadString('\n') 代替,者使用Scanner。

ReadRune

rune用来处理unicode或utf-8字符,该函数可以接收该类字符,返回接收字符的rune值、size大小(即字节数)以及error。

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {

    reader := bufio.NewReader(os.Stdin)

    r, size, err := reader.ReadRune()  // 龙

    fmt.Println("r = ", r)             // r =  40857
    fmt.Println("string =", string(r)) // string = 龙
    fmt.Println("size =", size)        // size = 3
    fmt.Println("err = ", err)         // err =  <nil>

}

ReadSlice

调用者应尽量使用ReadBytes或ReadString替代。

ReadString

func (b *Reader) ReadString(delim byte) (line string, err error)

  1. 返回一个包含已读取的数据和delim字节的字符串.
  2. 如果ReadString方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。
  3. 当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误。
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {

    reader := bufio.NewReader(os.Stdin)

    line, err := reader.ReadString('\n')

    fmt.Println("line = ", line)
    fmt.Println("err = ", err)

}

Golang 处理键盘输入的两种方法(fmt & bufio) https://blog.csdn.net/putyourheart/article/details/119844035
未经允许不得转载:沙滩星空的博客 » Go读取控制台输入

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址