I : input
输入操作
格式化输入
scanf
O
:
output
输出操作
格式化输出
printf
标准输入
==
》键盘设备
==
》
Stdin
标准输出
==
》显示器终端
==
》
Stdout
异常输出
==
》显示器终端
==
》
Stderr
1
、输入语句
Go
语言的标准输出流在打印到屏幕时有些参数跟别的语言(比如
C#
和
Java
)不同,
fmt
包实现了类似
C
语言
printf
和
scanf
的格式化
I/O
。
Go
语言
fmt
包下有
//
终端获取
func Scan (a ...interface{}) (n int, err error)
func Scanln (a ...interface{}) (n int, err error)
func Scanf (format string, a ...interface{}) (n int, err error)
其中
fmt.Scan
、
fmt.Scanf
、
fmt.Scanln
三个函数,可以在程序运行过程中从标准输入获取用户的输入。

func Scan(a ...interface{}) (n int, err error)
//
输入数据数量达标即可提交
举例如下:
func main() {
var (
name string
age int
married bool
)
fmt.Scan(&name, &age, &married)
fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age,
married)
}
func Scanf(format string, a ...interface{}) (n int, err error)
//
输入多次达到要求格式数据数量即可提交。 不区别换行和空格
举例如下:
func main() {
var (
name string
age int
married bool
)
ag1, err := fmt.Scanf("1:%s 2:%d 3:%t", &name, &age, &married)
// 这个函数中参数前必须填入标识格式如1: 2: ...
fmt.Println(ag1) //成功的数量
fmt.Println(err) //错误状态
fmt.Printf("扫描结果 name:%s age:%d married:%t", name, age, married)
}
func Scanln(a ...interface{}) (n int, err error)
//回车换行提交数据,数据输入一行。 中间不能有空白符 空格,TAB键 。。。
举例如下:
func main() {
var (
name string
age int
married bool
)
fmt.Scanln(&name, &age, &married)
fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age,
married)
}
建议读取控制台数据
调用
fmt.Scan
等方法
var j string
fmt.Scanln(&j) // Scanln
读取一行
fmt.Println("j = ", j)
或者指定输入格式
var j string
var m float32
var n bool
fmt.Scanf("%d%f%s%t", &i, &m, &j, &n)
fmt.Println("i = ", i, "j = ", j, "m = ", m, "n = ", n)
输入时按空格或回车区分即可
注意一个问题:
func main(){
var input byte
fmt.Println("请输入一个字母")
scan, err := fmt.Scan(&input)
if err != nil {
fmt.Println("err:", err)
}
fmt.Println(scan)
fmt.Printf("the anser is %c", input)
}
这里面定义一个变量接受
byte
但是却无法接收到。
这是因为
byte
类型本质是
uint8
类型的,所以应该传入整数的,
字母对应的 ASCII码值
但是还是要想传入字符类型 可以使用
scanf
进行,代码如下。
func main(){
var input byte
fmt.Println("请输入一个字母")
_, err := fmt.Scanf("%c", &input)
if err != nil {
fmt.Println("err:", err)
}
fmt.Printf("the anser is %c", input)
}
第二个问题:
%c
的空格也会识别到比如下面代码
练习:
使用
fmt.Scanf
和
fmt.Scanln
两种不同方式获取用户输入整数,比较后将大 的数字输出。
补充:
如果读取不带空格的数据可以使用
fmt.Scan
或
fmt.Scanln
读取一个或多个值, 但是不能读取带空格的数据,可以使用bufio
和
os
两个包结合
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// os.Stdin将终端中输入的数据写入到Stdin这个文件中去
reader := bufio.NewReader(os.Stdin)
fmt.Print("请输入一行数据,带空格也行:")
// line 从Stdin中读取一行的数据,(字节的切片)可以转换成字符串
5/126/12
// reader默认一次能读4096个字节,一个汉字是三个字节
// 一次性读完:isPrefix就等于false
// 先读一部分:isPrefix等于true
line, isPrefix, err := reader.ReadLine()
// 将字节的切片转换成字符串
data := string(line)
fmt.Println(line, isPrefix, err)
fmt.Println(data)
}
or 更简单
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
var msg string
reader := bufio.NewReader(os.Stdin) // 标准输入输出
msg, _ = reader.ReadString('\n') // 回车结束
msg = strings.TrimSpace(msg) // 去除最后一个空格
fmt.Printf("input=%s\n", msg) //结果输出
}