标准的输入输出:
按值读取
package main
import "fmt"
func main() {
// 读入一个值,空格和换行都算分隔符
var input1, input2 string
fmt.Scanf("%v", &input1)
fmt.Scan(&input2)
// 读取一行
var input3 string
fmt.Scanln(&input3)
fmt.Printf("input1 = %+v,input2 = %+v\ninput3 = %+v\n", input1, input2, input3)
}
注意,fmt.Scan
和 fmt.Scanln
的区别
-
fmt.Scan
是一个阻塞函数,只要还有没有接受完的参数,无论是 空格 还是 回车,都会不断的接受,直到接受完为止。 -
fmt.Scanln
也是一个阻塞函数,但他只能接受用 空格 分开的参数,只要一旦遇到 回车 ,阻塞函数就会停止。
按行读取
读取一行数据,这一行数据中可以出现空格、特殊字符等。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 读取一行字符串,包含空格等特殊字符
line, _ := reader.ReadString('\n')
fmt.Println(line)
// 读取一行数据
readLine, _, _ := reader.ReadLine()
fmt.Println(string(readLine))
}
切片输入
先输入元素个数,在输入每个元素。
package main
import (
"fmt"
)
func main() {
var count int
fmt.Scanf("%d",&count)
var slice []int
for i := 0; i < count; i++ {
var element int
fmt.Scan(&element)
slice=append(slice,element)
}
fmt.Println(slice)
}
多行输入(循环输入)
文件读取:读取到末尾时err
为EOF(end of file)或者在终端结束(control+c)
package main
import (
"fmt"
"io"
)
func main() {
var a, b int
for {
_, err := fmt.Scan(&a, &b)
if err == io.EOF {
break
}
fmt.Println(a + b)
}
}
文件读取方式在赛码官方中也有表达到
package main
import "fmt"
import "io"
func main() {
a := 0
b := 0
for {
_, err := fmt.Scanf("%d%d", &a, &b)
if err != nil {
if err == io.EOF {
break
}
} else {
fmt.Printf("%d\n", a+b)
}
}
}
循环读取:可以终端结束(control+c)
package main
import "fmt"
func main() {
var n,v int
for {
fmt.Scan(&n,&v)
fmt.Println(n+v)
}
}