Go fmt库常用操作

147 阅读8分钟

fmt标准库

1. fmt.Print:

控制台输出

 func Print(a ...any) (n int, err error) {
     return Fprint(os.Stdout, a...)
 }
 func Println(a ...any) (n int, err error) {
     return Fprintln(os.Stdout, a...)
 }
 func Printf(format string, a ...any) (n int, err error) {
     return Fprintf(os.Stdout, format, a...)
 }

fmt.Print 三个函数最终调用的都是Fprintf,os.Stdout为控制台输出

  1. fmt.Print 不换行
  2. fmt.Println 自动换行
  3. fmt.Printf 格式化输出

2. fmt.Fprint:

内容输入到一个io.Writer接口类型的变量w中

 func Fprint(w io.Writer, a ...any) (n int, err error) {
     p := newPrinter()
     p.doPrint(a)
     n, err = w.Write(p.buf)
     p.free()
     return
 }
 func Fprintf(w io.Writer, format string, a ...any) (n int, err error) {
     p := newPrinter()
     p.doPrintf(format, a)
     n, err = w.Write(p.buf)
     p.free()
     return
 }
 func Fprintln(w io.Writer, a ...any) (n int, err error) {
     p := newPrinter()
     p.doPrintln(a)
     n, err = w.Write(p.buf)
     p.free()
     return
 }

返回的值中,n为写入的字节量,err是错误信息

一般该函数用于写在文件中

 func TestFPrint1(t *testing.T) {
     file, _ := os.OpenFile("test.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
     fmt.Fprintln(file, "追加写入")
     file.Close()
 }
 package main
 ​
 import (
     "fmt"
     "net/http"
 )
 ​
 func main() {
     //输入
     http.ListenAndServe(":8088", &MyHandler{})
 }
 ​
 type MyHandler struct {
 }
 ​
 func (*MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
     fmt.Fprintln(w, "我是http返回的信息")
 }

只要传入的内容是实现了io.Writer接口的内容即可

http.ResponseWriter也实现了这个接口

image-20230729100012839.png

通过该函数可以在http中写回数据

3. fmt.Sprint:

把传入数据生成并返回一个字符串

 func Sprint(a ...any) string {
     p := newPrinter()
     p.doPrint(a)
     s := string(p.buf)
     p.free()
     return s
 }
 func Sprintf(format string, a ...any) string {
     p := newPrinter()
     p.doPrintf(format, a)
     s := string(p.buf)
     p.free()
     return s
 }
 func Sprintln(a ...any) string {
     p := newPrinter()
     p.doPrintln(a)
     s := string(p.buf)
     p.free()
     return s
 }
  1. fmt.Sprintf函数用于格式化字符串。它通过接收一个格式化字符串作为参数,然后根据指定的格式将相应的值转换为字符串。

     value := 42
     s := fmt.Sprintf("The value is %d", value)
    

    上述代码会将整数值42转换为字符串,并赋值给s变量。输出结果为The value is 42

    fmt.Sprintf提供了更灵活和多样化的格式化和转换选项。你可以使用诸如%d%f%s等占位符来指定转换类型,还可以进行宽度、精度、对齐等格式化设置。它也支持结构体、数组、切片等复杂类型的格式化转换。

  2. strconv.Itoa函数用于将整数转换为字符串。它接收一个整数值作为参数,然后将其转换为等价的十进制字符串表示形式。

     value := 42
     s := strconv.Itoa(value)
    

    上述代码将整数值42转换为字符串,并赋值给s变量。输出结果为字符串"42",而不是格式化的字符串。

    strconv.Itoa函数仅适用于整数类型的转换,不能用于其他数据类型的转换。

总结来说,fmt.Sprintf用于格式化复杂的输出字符串,支持各种类型的转换和格式化设置。而strconv.Itoa则是将整数转换为字符串的简单方法。使用时需要根据具体的场景选择适合的函数。

4. fmt.Errorf:

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

 func Errorf(format string, a ...any) error

5. fmt.Scan:

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

 func Scan(a ...any) (n int, err error) {
     return Fscan(os.Stdin, a...)
 }

返回内容:

  • n:成功扫描的数据个数n
  • err:遇到的任何错误
 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)
 }

6. fmt.Scanf

以format定义的格式来进行输入

 func Scanf(format string, a ...any) (n int, err error) {
     return Fscanf(os.Stdin, format, a...)
 }

实际调用了fmt.Fscanf()函数

 func main() {
     var (
         name    string
         age     int
         married bool
     )
     fmt.Scanf("1:%s 2:%d 3:%t", &name, &age, &married)
     fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)
 }

image-20230729100947130.png

第一行的内容均需要手动输入

7. fmt.Scanln

遇到回车就结束扫描

和fmt.Scan的一个区别在于,fmt.Scan遇到回车后,如果还有未读取的数据会等待读取,而fmt.Scanln会不继续读取。比如,下面这个,假如输入完名字,按回车,fmt.Scanln会立刻输出,age为0,married为false,而fmt.Scan则不同,会等待age和married输入

 func Scanln(a ...any) (n int, err error) {
     return Fscanln(os.Stdin, a...)
 }
 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)
 }

8. fmt.Fscanf

将内容从一个io.Reader接口类型的变量r中读取出来,将连续的以空格分隔的值存储到由格式确定的连续的参数中

用于从输入流中读取格式化的数据,并将其存储到变量中

 func Fscanf(r io.Reader, format string, a ...any) (n int, err error) {
     s, old := newScanState(r, false, false)
     n, err = s.doScanf(format, a)
     s.free(old)
     return
 }
 func Fscan(r io.Reader, a ...any) (n int, err error) {
     s, old := newScanState(r, true, false)
     n, err = s.doScan(a)
     s.free(old)
     return
 }
 func Fscanln(r io.Reader, a ...any) (n int, err error) {
     s, old := newScanState(r, false, true)
     n, err = s.doScan(a)
     s.free(old)
     return
 }
  • r io.Reader: 此参数包含扫描的指定文本。
  • format string: 此参数包含用于接收元素的不同格式。
  • a …any: 此参数是每个元素的指定变量。

返回值: 它返回成功解析的项目数和错误


9. 占位符(补充)

通用

占位符说明
%v值的默认格式表示
%+v类似%v,但输出结构体时会添加字段名
%#v值的Go语法表示
%T打印值的类型
%%百分号

布尔型

占位符说明
%ttrue或false

整型

占位符说明
%b表示为二进制
%c该值对应的unicode码值
%d表示为十进制
%o表示为八进制
%x表示为十六进制,使用a-f
%X表示为十六进制,使用A-F
%U表示为Unicode格式:U+1234,等价于”U+%04X”
%q该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示

浮点数与复数

占位符说明
%b无小数部分、二进制指数的科学计数法,如-123456p-78
%e科学计数法,如-1234.456e+78
%E科学计数法,如-1234.456E+78
%f有小数部分但无指数部分,如123.456
%F等价于%f
%g根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)
%G根据实际情况采用%E或%F格式(以获得更简洁、准确的输出)

字符串和[]byte

占位符说明
%s直接输出字符串或者[]byte
%q该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示
%x每个字节用两字符十六进制数表示(使用a-f
%X每个字节用两字符十六进制数表示(使用A-F)

指针

占位符说明
%p表示为十六进制,并加上前导的0x

宽度标识符

宽度通过一个紧跟在百分号后面的十进制数指定,如果未指定宽度,则表示值时除必需之外不作填充。

精度通过(可选的)宽度后跟点号后跟的十进制数指定。如果未指定精度,会使用默认精度;如果点号后没有跟数字,表示精度为0。

占位符说明
%f默认宽度,默认精度
%10f宽度9,默认精度
%.2f默认宽度,精度2
%10.2f宽度9,精度2
%10.f宽度9,精度0

其他falg

占位符说明
+总是输出数值的正负号;对%q(%+q)会生成全部是ASCII字符的输出(通过转义);
空格对数值,正数前加空格而负数前加负号;对字符串采用%x或%X时(% x或% X)会给各打印的字节之间加空格
-在输出右边填充空白而不是默认的左边(即从默认的右对齐切换为左对齐);
#八进制数前加0(%#o),十六进制数前加0x(%#x)或0X(%#X),指针去掉前面的0x(%#p)对%q(%#q),对%U(%#U)会输出空格和单引号括起来的go字面值;
0使用0而不是空格填充,对于数值类型会把填充的0放在正负号后面;

10. Strconv库的用法(补充)

提供了字符串和基本数据类型之间的相互转换功能,涵盖了整型、浮点型、布尔型和Unicode字符等的转换

1.Atoi 和 Itoa

  • Atoi函数用于将字符串转换为整型。示例:num, err := strconv.Atoi("123")
  • Itoa函数用于将整型转换为字符串。示例:str := strconv.Itoa(123)

2.Parse 系列函数

  • ParseInt函数用于将字符串转换为指定进制的整型。示例:num, err := strconv.ParseInt("1010", 2, 64)
  • ParseFloat函数用于将字符串转换为浮点型。示例:num, err := strconv.ParseFloat("3.14", 64)
  • ParseBool函数用于将字符串转换为布尔型。示例:bool, err := strconv.ParseBool("true")

3.Format 系列函数

  • FormatInt函数用于将整型转换为指定进制的字符串。示例:str := strconv.FormatInt(10, 2)
  • FormatFloat函数用于将浮点型转换为字符串。示例:str := strconv.FormatFloat(3.14, 'f', 2, 64)
  • FormatBool函数用于将布尔型转换为字符串。示例:str := strconv.FormatBool(true)

4.Quote 和 Unquote

  • Quote函数用于将字符串添加双引号并转义特殊字符。示例:quoted := strconv.Quote("Hello, "Golang"")
  • Unquote函数用于去除字符串的双引号和转义字符。示例:unquoted, err := strconv.Unquote(""Hello, "Golang""")

5.其他函数

  • IsPrint函数用于判断字符是否为可打印字符。
  • CanBackquote函数用于判断字符串是否可以使用Raw字符串字面值表示。

用起来可能还是fmt.Springf更强大一些