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为控制台输出
fmt.Print不换行fmt.Println自动换行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也实现了这个接口
通过该函数可以在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
}
-
fmt.Sprintf函数用于格式化字符串。它通过接收一个格式化字符串作为参数,然后根据指定的格式将相应的值转换为字符串。value := 42 s := fmt.Sprintf("The value is %d", value)上述代码会将整数值
42转换为字符串,并赋值给s变量。输出结果为The value is 42。fmt.Sprintf提供了更灵活和多样化的格式化和转换选项。你可以使用诸如%d、%f、%s等占位符来指定转换类型,还可以进行宽度、精度、对齐等格式化设置。它也支持结构体、数组、切片等复杂类型的格式化转换。 -
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)
}
第一行的内容均需要手动输入
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 | 打印值的类型 |
| %% | 百分号 |
布尔型
| 占位符 | 说明 |
|---|---|
| %t | true或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更强大一些