跳到主要内容

输入输出函数

6.1、输出函数

fmt.Print有几个变种:

提示

Print: 输出到控制台,不接受任何格式化操作

提示

Println: 输出到控制台并换行

提示

Printf : 只可以打印出格式化的字符串,只可以直接输出字符串类型的变量(不可以输出别的类型)

提示

Sprintf:格式化并返回一个字符串而不带任何输出

(1)Print 和Println

Print和Println()函数可以打印出字符串或变量的值。

    name := "yuan"

age := 24

fmt.Print(name, age)

fmt.Println("hello world")
fmt.Println(name)
fmt.Println(age)
fmt.Println(name, age)

fmt.Println("姓名:", name, "年龄:", age)

(2)格式化输出(Printf)

Printf 根据格式说明符格式化并写入标准输出。Printf 只打印字符串

比如上面打印一个人的基本信息格式:

  name := "yuan"
age := 24
isMarried := false
salary := 3000.549

fmt.Printf("姓名:%s 年龄:%d 婚否:%t 薪资:%.2f\n", name, age, isMarried, salary)
fmt.Printf("姓名:%v 年龄:%v 婚否:%v 薪资:%v\n", name, age, isMarried, salary)
fmt.Printf("姓名:%#v 年龄:%#v 婚否:%#v 薪资:%#v\n", name, age, isMarried, salary)

| |

| ------------------------------------------------------------ |

| %v:以默认的方式打印变量的值 |

| %#v:相应值的Go语法表示 |

| %T:打印对应值的类型 |

| %+d :带符号的整型,%d 不带符号的整型 |

| %o :不带零的八进制,%#o 带零的八进制 |

| %x :小写的十六进制,%X 大写的十六进制,%#x 带0x的十六进制 |

| %b :打印整型的二进制 |

| %t :打印true 或 false |

| %s :输出字符串表示,%-5s 最小宽度为5(左对齐) |

| %f 小数点而无指数,默认精度为6 |

| %e 科学计数法,如-1234.456e+78 |

| %p 带0x的指针,%#p 不带0x的指针 |

// 整形和浮点型

fmt.Printf("%b\n", 12) // 二进制表示:1100

fmt.Printf("%d\n", 12) // 十进制表示:12

fmt.Printf("%o\n", 12) // 八进制表示:14

fmt.Printf("%x\n", 12) // 十六进制表示:c

fmt.Printf("%X\n", 12) // 十六进制表示:c

fmt.Printf("%f\n", 3.1415) // 有小数点而无指数:3.141500

fmt.Printf("%.3f\n", 3.1415) // 3.142

fmt.Printf("%e\n", 1000.25) // 科学计数法: 1.000250e+03,默认精度为6

// 设置宽度

fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1001", "alvin", 100)

fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1002", "zuibangdeyuanlaoshi", 98)

fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1003", "x", 78)

(3)Sprintf

Printf和Sprintf都是替换字符串,Printf是直接输出到终端,Sprintf是不直接输出到终端,而是返回该字符串

	name := "yuan"
age := 24
isMarried := false
salary := 3000.549

info := fmt.Sprintf("姓名:%s 年龄:%d 婚否:%t 薪资:%.2f\n", name, age, isMarried, salary)

fmt.Println(info)

6.2、输入函数

go语言fmt包下有三个函数,可以在程序运行过程中从标准输入获取用户的输入:

(1)fmt.Scan

语法:


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

  • Scan 从标准输入扫描文本,读取由空白符分隔的值保存到传递给本函数的参数中,换行符视为空白符。

  • 本函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因。

package main

import "fmt"

func main() {
var (
name string
age int
isMarried bool
)

fmt.Scan(&name, &age, &isMarried) // 输入类型不一致,按默认值

fmt.Printf("扫描结果 name:%s age:%d married:%t\t", name, age, isMarried)

}

将上述代码在终端运行,在终端依次输入 yuan 、26、false使用空格分隔。


go run main.go

yuan 26 false

扫描结果 name:yuan age:26 married:false

fmt.Scan从标准输入中扫描用户输入的数据,将以空白符分隔的数据分别存入指定的参数中。

(2)fmt.Scanf

语法


func Scanf(format string, a ...interface{})(n int, err error)

  • Scanf从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到传递给本函数的参数中。

  • 本函数返回成功扫描的数据个数和遇到的任何错误。

// 案例1

var (
name string
age int
isMarried bool
)

fmt.Scanf("1:%s 2:%d 3:%t", &name,&age,&isMarried)

fmt.Printf("扫描结果 姓名:%s 年龄:%d 婚否:%t", name,age,isMarried)

// 案例2

var a, b int

fmt.Scanf("%d+%d", &a, &b)
fmt.Println(a + b)

(3)fmt.Scanln

语法


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

  • Scanln类似于Scan,它遇到换行立即停止扫描。

  • 本函数返回成功扫描的数据个数和遇到的任何错误。

提示

Scanln和Scan的区别就是Scanln遇到换行立即结束输入,而Scan则会将换行符作为一个空白符继续下一个输入