1.输出
1.1.Print
Print系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,
Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符
fmt.Print("HelloWorld ")name := "cheng"fmt.Printf("%s\n",name) //HelloWorld chenfmt.Println("HelloWorld") //HelloWorld
1.2.Fprint
Fprint系列函数会将内容输出到一个io.Writer接口类型的变量w中,我们通常用这个函数往文件中写入内容
//向标准输出写入内容fmt.Fprintln(os.Stdout,"向标准输出写入内容")
fileobj, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)if err != nil {fmt.Println("打开文件出错",err)return}name := "cheng"fmt.Fprintf(fileobj,"往文件中写如信息%s",name)
1.3.Sprint
Sprint系列函数会把传入的数据生成并返回一个字符串
str1 := fmt.Sprintln("HelloWorld")name := "cheng"age := 18str2 := fmt.Sprintf("name:%s,age:%d",name,age)fmt.Println(str1) //HelloWorldfmt.Println(str2) //name:cheng,age:18
1.4.Errorf
Errorf函数根据format参数生成格式化字符串并返回一个包含该字符串的错误
err := fmt.Errorf("error")fmt.Println(err) //error
err := errors.New("原始错误")w := fmt.Errorf("wrap一个错误%w", err)fmt.Println(w) //wrap一个错误原始错误
fmt.Errorf函数新加了一个%w占位符用来生成一个可以包裹Error的Wrapping Error。
2.格式化占位符
2.1通用占位符
| 占位符 | 说明 |
|---|---|
| %v | 值的默认格式表示 |
| %+v | 类似%v,但输出结构体时会添加字段名 |
| %#v | 值的Go语法表示 |
| %T | 打印值的类型 |
| %% | 百分号 |
fmt.Printf("%v\n",100) //100fmt.Printf("%v\n",false) //falseo := struct {name string}{"cheng"}fmt.Printf("%v\n",o) //{cheng}fmt.Printf("%#v\n",o) //struct { name string }{name:"cheng"}fmt.Printf("%T\n",o) //struct { name string }fmt.Printf("100%%\n") //100%
2.2布尔型
| 占位符 | 说明 |
|---|---|
| %t | true或false |
n :=falsefmt.Printf("%t",n) //false
2.3整型
n :=65fmt.Printf("%b\n",n) //1000001(二进制)fmt.Printf("%c\n",n) //Afmt.Printf("%d\n",n) //65fmt.Printf("%o\n",n) //101fmt.Printf("%x\n",n) //41fmt.Printf("%X\n",n) //41
2.4浮点数与复数
| 占位符 | 说明 |
|---|---|
| %b | 无小数部分、二进制指数的科学计数法,如-123456p-78 |
| %e | 科学计数法,如-1234.456e+78 |
| %E | 科学计数法,如-1234.456E+78 |
| %f | 有小数部分但无指数部分,如123.456 |
| %F | 等价于%f |
| %g | 根据实际情况采用%e或%f格式(以获得更简洁、准确的输出) |
| %G | 根据实际情况采用%E或%F格式(以获得更简洁、准确的输出) |
f := 12.34fmt.Printf("%b\n",f) //6946802425218990p-49fmt.Printf("%e\n",f) //1.234000e+01fmt.Printf("%E\n",f) //1.234000E+01fmt.Printf("%f\n",f) //12.340000fmt.Printf("%g\n",f) //12.34fmt.Printf("%G\n",f) //12.34
2.5字符串和[]byte
| 占位符 | 说明 |
|---|---|
| %s | 直接输出字符串或者[]byte |
| %q | 该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示 |
| %x | 每个字节用两字符十六进制数表示(使用a-f |
| %X | 每个字节用两字符十六进制数表示(使用A-F) |
str := "cheng"fmt.Printf("%s\n",str) //chengfmt.Printf("%q\n",str) //"cheng" 双引号括起来fmt.Printf("%x\n",str) //6368656e67fmt.Printf("%X\n",str) //6368656E67
2.6指针
| 占位符 | 说明 |
|---|---|
| %p | 表示为十六进制,并加上前导的0x |
a := 10fmt.Printf("%p\n",&a) //0xc000128058fmt.Printf("%#p\n",&a) //c000128058
2.7宽度标识符
| %f | 默认宽度,默认精度 |
|---|---|
| %9f | 宽度9,默认精度 |
| %.2f | 默认宽度,精度2 |
| %9.2f | 宽度9,精度2 |
| %9.f | 宽度9,精度0 |
n := 12.34fmt.Printf("%f\n",n) //默认宽度,默认精度fmt.Printf("%9f\n",n) //宽度9,默认精度fmt.Printf("%.2f\n",n) //默认宽度,精度2fmt.Printf("%9.2f\n",n) //宽度9,精度2fmt.Printf("%9.f\n",n) //宽度9,精度0
2.7其他flag
n := "张三"fmt.Printf("%s\n",n)fmt.Printf("%v\n",n)fmt.Printf("%5s\n",n)fmt.Printf("%-5s\n",n)fmt.Printf("%-5.7s\n",n)fmt.Printf("%5.2s\n",n)fmt.Printf("%05s\n",n)/**张三张三张三张三张三张三000张三*/
3.获取输入
fmt包下有fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,可以在程序运行过程中从标准输入获取用户的输入。
3.1fmt.Scan
fmt.Scan从标准输入中扫描用户输入的数据,将以空白符分隔的数据分别存入指定的参数。
var(name stringage intmarried bool)fmt.Scan(&name,&age,&married)fmt.Printf("%s %d %t\n",name,age,married)
3.2fmt.Scanf
fmt.Scanf不同于fmt.Scan简单的以空格作为输入数据的分隔符
fmt.Scanf为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。
var(name stringage intmarried bool)fmt.Scanf("1:%s 2:%d 3:%t",&name,&age,&married)fmt.Printf("%s %d %t",name,age,married)//1:cheng 2:18 3:false//cheng 18 false
3.3fmt.Scanln
Scanln类似Scan,它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。
var(name stringage intmarried bool)fmt.Scanln(&name,&age,&married)fmt.Printf("%s %d %t",name,age,married)
fmt.Scanln遇到回车就结束扫描了,这个比较常用
3.4bufio.NewReader
完整获取输入的内容,而输入的内容可能包含空格,这种情况下可以使用bufio包来实现。
reader := bufio.NewReader(os.Stdin) // 从标准输入生成读对象fmt.Printf("请输入内容\n")text, _ := reader.ReadString('\n') // 读到换行text = strings.TrimSpace(text)fmt.Printf("%#v\n",text)
reader := bufio.NewReader(os.Stdin)fmt.Println("请输入内容") //chengtext, _ := reader.ReadString('\n')text = strings.TrimSpace(text)fmt.Println(text) //cheng
3.5Fscan系列
这几个函数功能分别类似于fmt.Scan、fmt.Scanf、fmt.Scanln三个函数
只不过它们不是从标准输入中读取数据而是从io.Reader中读取数据
func Fscan(r io.Reader, a ...interface{}) (n int, err error)func Fscanln(r io.Reader, a ...interface{}) (n int, err error)func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
3.6Sscan系列
这几个函数功能分别类似于fmt.Scan、fmt.Scanf、fmt.Scanln三个函数
只不过它们不是从标准输入中读取数据而是从指定字符串中读取数据
func Sscan(str string, a ...interface{}) (n int, err error)func Sscanln(str string, a ...interface{}) (n int, err error)func Sscanf(str string, format string, a ...interface{}) (n int, err error)
