1.输出

1.1.Print

Print系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,
Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符

  1. fmt.Print("HelloWorld ")
  2. name := "cheng"
  3. fmt.Printf("%s\n",name) //HelloWorld chen
  4. fmt.Println("HelloWorld") //HelloWorld

1.2.Fprint

Fprint系列函数会将内容输出到一个io.Writer接口类型的变量w中,我们通常用这个函数往文件中写入内容

  1. //向标准输出写入内容
  2. fmt.Fprintln(os.Stdout,"向标准输出写入内容")
  1. fileobj, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
  2. if err != nil {
  3. fmt.Println("打开文件出错",err)
  4. return
  5. }
  6. name := "cheng"
  7. fmt.Fprintf(fileobj,"往文件中写如信息%s",name)

1.3.Sprint

Sprint系列函数会把传入的数据生成并返回一个字符串

  1. str1 := fmt.Sprintln("HelloWorld")
  2. name := "cheng"
  3. age := 18
  4. str2 := fmt.Sprintf("name:%s,age:%d",name,age)
  5. fmt.Println(str1) //HelloWorld
  6. fmt.Println(str2) //name:cheng,age:18

1.4.Errorf

Errorf函数根据format参数生成格式化字符串并返回一个包含该字符串的错误

  1. err := fmt.Errorf("error")
  2. fmt.Println(err) //error
  1. err := errors.New("原始错误")
  2. w := fmt.Errorf("wrap一个错误%w", err)
  3. fmt.Println(w) //wrap一个错误原始错误

fmt.Errorf函数新加了一个%w占位符用来生成一个可以包裹Error的Wrapping Error。

2.格式化占位符

2.1通用占位符

占位符 说明
%v 值的默认格式表示
%+v 类似%v,但输出结构体时会添加字段名
%#v 值的Go语法表示
%T 打印值的类型
%% 百分号
  1. fmt.Printf("%v\n",100) //100
  2. fmt.Printf("%v\n",false) //false
  3. o := struct {
  4. name string
  5. }{"cheng"}
  6. fmt.Printf("%v\n",o) //{cheng}
  7. fmt.Printf("%#v\n",o) //struct { name string }{name:"cheng"}
  8. fmt.Printf("%T\n",o) //struct { name string }
  9. fmt.Printf("100%%\n") //100%

2.2布尔型

占位符 说明
%t true或false
  1. n :=false
  2. fmt.Printf("%t",n) //false

2.3整型

  1. n :=65
  2. fmt.Printf("%b\n",n) //1000001(二进制)
  3. fmt.Printf("%c\n",n) //A
  4. fmt.Printf("%d\n",n) //65
  5. fmt.Printf("%o\n",n) //101
  6. fmt.Printf("%x\n",n) //41
  7. fmt.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格式(以获得更简洁、准确的输出)
  1. f := 12.34
  2. fmt.Printf("%b\n",f) //6946802425218990p-49
  3. fmt.Printf("%e\n",f) //1.234000e+01
  4. fmt.Printf("%E\n",f) //1.234000E+01
  5. fmt.Printf("%f\n",f) //12.340000
  6. fmt.Printf("%g\n",f) //12.34
  7. fmt.Printf("%G\n",f) //12.34

2.5字符串和[]byte

占位符 说明
%s 直接输出字符串或者[]byte
%q 该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示
%x 每个字节用两字符十六进制数表示(使用a-f
%X 每个字节用两字符十六进制数表示(使用A-F)
  1. str := "cheng"
  2. fmt.Printf("%s\n",str) //cheng
  3. fmt.Printf("%q\n",str) //"cheng" 双引号括起来
  4. fmt.Printf("%x\n",str) //6368656e67
  5. fmt.Printf("%X\n",str) //6368656E67

2.6指针

占位符 说明
%p 表示为十六进制,并加上前导的0x
  1. a := 10
  2. fmt.Printf("%p\n",&a) //0xc000128058
  3. fmt.Printf("%#p\n",&a) //c000128058

2.7宽度标识符

%f 默认宽度,默认精度
%9f 宽度9,默认精度
%.2f 默认宽度,精度2
%9.2f 宽度9,精度2
%9.f 宽度9,精度0
  1. n := 12.34
  2. fmt.Printf("%f\n",n) //默认宽度,默认精度
  3. fmt.Printf("%9f\n",n) //宽度9,默认精度
  4. fmt.Printf("%.2f\n",n) //默认宽度,精度2
  5. fmt.Printf("%9.2f\n",n) //宽度9,精度2
  6. fmt.Printf("%9.f\n",n) //宽度9,精度0

2.7其他flag

  1. n := "张三"
  2. fmt.Printf("%s\n",n)
  3. fmt.Printf("%v\n",n)
  4. fmt.Printf("%5s\n",n)
  5. fmt.Printf("%-5s\n",n)
  6. fmt.Printf("%-5.7s\n",n)
  7. fmt.Printf("%5.2s\n",n)
  8. fmt.Printf("%05s\n",n)
  9. /**
  10. 张三
  11. 张三
  12. 张三
  13. 张三
  14. 张三
  15. 张三
  16. 000张三
  17. */

3.获取输入

fmt包下有fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,可以在程序运行过程中从标准输入获取用户的输入。

3.1fmt.Scan

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

  1. var(
  2. name string
  3. age int
  4. married bool
  5. )
  6. fmt.Scan(&name,&age,&married)
  7. fmt.Printf("%s %d %t\n",name,age,married)

3.2fmt.Scanf

fmt.Scanf不同于fmt.Scan简单的以空格作为输入数据的分隔符
fmt.Scanf为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。

  1. var(
  2. name string
  3. age int
  4. married bool
  5. )
  6. fmt.Scanf("1:%s 2:%d 3:%t",&name,&age,&married)
  7. fmt.Printf("%s %d %t",name,age,married)
  8. //1:cheng 2:18 3:false
  9. //cheng 18 false

3.3fmt.Scanln

Scanln类似Scan,它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。

  1. var(
  2. name string
  3. age int
  4. married bool
  5. )
  6. fmt.Scanln(&name,&age,&married)
  7. fmt.Printf("%s %d %t",name,age,married)

fmt.Scanln遇到回车就结束扫描了,这个比较常用

3.4bufio.NewReader

完整获取输入的内容,而输入的内容可能包含空格,这种情况下可以使用bufio包来实现。

  1. reader := bufio.NewReader(os.Stdin) // 从标准输入生成读对象
  2. fmt.Printf("请输入内容\n")
  3. text, _ := reader.ReadString('\n') // 读到换行
  4. text = strings.TrimSpace(text)
  5. fmt.Printf("%#v\n",text)
  1. reader := bufio.NewReader(os.Stdin)
  2. fmt.Println("请输入内容") //cheng
  3. text, _ := reader.ReadString('\n')
  4. text = strings.TrimSpace(text)
  5. fmt.Println(text) //cheng

3.5Fscan系列

这几个函数功能分别类似于fmt.Scan、fmt.Scanf、fmt.Scanln三个函数
只不过它们不是从标准输入中读取数据而是从io.Reader中读取数据

  1. func Fscan(r io.Reader, a ...interface{}) (n int, err error)
  2. func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
  3. func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)

3.6Sscan系列

这几个函数功能分别类似于fmt.Scan、fmt.Scanf、fmt.Scanln三个函数
只不过它们不是从标准输入中读取数据而是从指定字符串中读取数据

  1. func Sscan(str string, a ...interface{}) (n int, err error)
  2. func Sscanln(str string, a ...interface{}) (n int, err error)
  3. func Sscanf(str string, format string, a ...interface{}) (n int, err error)