fmt包是一个格式化输入输出的包,它提供了很多与C语言类似的格式化字符串方式来格式化输出内容。fmt包可以用于向控制台、文件、网络等输出内容
基本用法
格式化输出
可以使用Print、Printf、Println等函数输出文本,例如:
fmt.Print("hello, world")
fmt.Printf("number: %d, string: %s", 100, "hello")
fmt.Println("hello, world")
这些函数的区别在于输出的方式不同:
Print:直接将字符串输出到控制台,不换行
Printf:格式化输出字符串到控制台,不换行
Println:输出字符串到控制台并换行
规律:后面的f :format
格式化字符串
使用fmt.Sprintf可以将格式化的字符串赋值给变量,例如:
规律:前面的f :file,s:string
str := fmt.Sprintf("number: %d, string: %s", 100, "hello")
打印变量
使用Print、Printf、Println可以输出变量,例如:
num := 100
str := "hello"
fmt.Print(num, str)
fmt.Printf("number: %d, string: %s", num, str)
fmt.Println(num, str)
格式化字符串
fmt包中的格式化字符串支持的占位符包括:
占位符 | 说明 |
%v | 值的默认格式表示 |
%+v | 类似%v,但在输出结构体时会添加字段名 |
%#v | 值的Go语言语法表示 |
%T | 值的类型的Go语言表示 |
%% | 字符% |
可以使用它们来格式化不同类型的数据,例如:
fmt.Printf("%v\n", 100) // 100
fmt.Printf("%v\n", "hello") // hello
fmt.Printf("%v\n", []int{1, 2, 3}) // [1 2 3]
fmt.Printf("%#v\n", []int{1, 2, 3}) // []int{1, 2, 3}
fmt.Printf("%T\n", []int{1, 2, 3}) // []int
fmt.Printf("%%\n") // %
在格式化字符串中,可以使用宽度和精度来指定输出的宽度和小数点后的位数,例如:
fmt.Printf("%8d\n", 100) // 100
fmt.Printf("%.2f\n", 3.14159) // 3.14
输出到文件
使用fmt库输出到文件的方式有两种:一种是通过打开文件创建一个文件对象,然后将文件对象传递给fmt库的函数,让函数将数据写入到文件中;另一种是直接使用os.Stdout和os.Stderr等标准输出对象的方法,将输出流重定向到文件对象上,然后再使用fmt库的函数进行输出
使用Fprint、Fprintf、Fprintln等函数输出到文件。例如:
// 打开需要输出的文件
file, err := os.Create("output.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
fmt.Fprint(file, "hello, world")
fmt.Fprintf(file, "number: %d, string: %s", 100, "hello")
fmt.Fprintln(file, "hello, world")
综上,fmt库提供了多种输出方式,可以根据实际需求选择不同的输出方式。需要注意的是,在使用文件对象进行输出时,需要手动关闭文件对象,以防止文件句柄泄露。
输出到网络
输出到TCP连接
可以使用fmt.Fprintf()函数将文本输出到TCP连接。下面的代码展示了如何在服务器程序中使用fmt.Fprintf()函数将文本输出到TCP连接中:
package main
import (
"fmt"
"net"
)
func main() {
ln, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("error:", err)
return
}
defer ln.Close()
for {
conn, err := ln.Accept()
if err != nil {
fmt.Println("error:", err)
continue
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
fmt.Fprintf(conn, "Hello, client!\n")
// ...
}
在上述代码中,服务器程序会监听8080端口,并在接收到连接请求后,启动一个协程来处理连接。在handleConnection()函数中,使用fmt.Fprintf()将“Hello, client!”文本输出到TCP连接中。
输出到UDP连接
使用fmt.Fprintf()函数可以将文本输出到UDP连接中。下面的代码展示了如何在服务器程序中使用fmt.Fprintf()函数将文本输出到UDP连接中:
package main
import (
"fmt"
"net"
)
func main() {
conn, err := net.ListenPacket("udp", ":8080")
if err != nil {
fmt.Println("error:", err)
return
}
defer conn.Close()
buf := make([]byte, 1024)
for {
n, addr, err := conn.ReadFrom(buf)
if err != nil {
fmt.Println("error:", err)
continue
}
go handleConnection(conn, addr, buf[:n])
}
}
func handleConnection(conn net.PacketConn, addr net.Addr, buf []byte) {
fmt.Fprintf(conn, "Hello, client!\n")
// ...
}
在上述代码中,服务器程序会监听8080端口,并在接收到UDP数据包后,启动一个协程来处理连接。在handleConnection()函数中,使用fmt.Fprintf()将“Hello, client!”文本输出到UDP连接中。
输出到HTTP响应
在HTTP服务器程序中,可以使用fmt.Fprintf()函数将文本输出到HTTP响应中。下面的代码展示了如何在HTTP服务器程序中使用fmt.Fprintf()函数将文本输出到HTTP响应中:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, client!\n")
})
http.ListenAndServe(":8080", nil)
}
在上述代码中,使用http.HandleFunc()函数设置HTTP处理函数,当收到HTTP请求时,使用fmt.Fprintf()函数将“Hello, client!”文本输出到HTTP响应中