Golang - fmt包


fmt.Print - 格式化输出

示例

package main

import (
	"fmt"
	"os"
)

func main() {
	name := "ky"

	// 将格式化后的字符串输出给文件, f 为文件句柄
	fmt.Fprintf(f, "%v\n", name)

	// 将格式化的字符串输出到终端, 将文件句柄固定为os.stdout
	fmt.Printf("%v\n", name)

	// 将格式化后的字符串返回
	a := fmt.Sprintf("my name is %v", name)
}


源码

// Fprintf formats according to a format specifier and writes to w.
// It returns the number of bytes written and any write error encountered.
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
	p := newPrinter()
	p.doPrintf(format, a)
	n, err = w.Write(p.buf)
	p.free()
	return
}

// Printf formats according to a format specifier and writes to standard output.
// It returns the number of bytes written and any write error encountered.
func Printf(format string, a ...interface{}) (n int, err error) {
	return Fprintf(os.Stdout, format, a...)
}

// Sprintf formats according to a format specifier and returns the resulting string.
func Sprintf(format string, a ...interface{}) string {
	p := newPrinter()
	p.doPrintf(format, a)
	s := string(p.buf)
	p.free()
	return s
}


格式化参数

package main

import "fmt"

func main() {
	// %v 通用
	num := 18
	fmt.Printf("%v\n", num) // 18

	// %T 打印类型
	fmt.Printf("%T\n" num) // int

	// 指针
	fmt.Printf("%p\n", &s1)  // 带0x的指针
	fmt.Printf("%#p\n", &s1) // 不带0x的指针

	// %% 百分号
	fmt.Printf("%d%%\n", num) // 95%

	// 打印进制
	b := 15
	// %b 二进制, %d 十进制, %o 八进制, %x 十六进制
	fmt.Printf("%[1]b %[1]d %[1]o %[1]x\n", b)
	
	// 布尔值
	m := true
	fmt.Printf("%t\n", m)
	
	// 支持索引使用
	m := "a"
	n := "b"

	// 直接使用索引
	fmt.Printf("%[1]v,%[1]v,%[1]v,%[2]v\n", m, n) // a,a,a,b

	// 重新使用索引1后, 后边的顺序会重置
	fmt.Printf("%v,%v,%[1]v,%v\n", m, n) // 
}


int和float 相关用法

package main

import "fmt"

func main() {
	// 带符号的整型
	a := +15
	b := -15
	fmt.Printf("%+d, %+d\n", a, b) // +15, -15, 类型都为int

	// 指定长度的整型
	fmt.Printf("|%5d|\n", a)  // |    1|, 共5位, 默认右对齐
	fmt.Printf("|%-5d|\n", a) // |1    |, 共5位, 左对齐
	fmt.Printf("|%05d|\n", a) // |00001|, 共5位, 在前边补0

	// 特殊用法
	m := 123
	n := 5
	fmt.Printf("%[1]*[2]d\n", a, pi) // 总宽度为5, 结果为  123(左数2个空格)

	// %f
	x := 3.1415926 
	y := 3.14

	fmt.Printf("%f, %f\n", x, y) // 3.141593 3.140000 默认保留6位小数, 会四舍五入
	fmt.Printf("%5.f\n", x)       // 视为%5.0f, 总宽度为5, 小数点后保留0位, 结果为    3(左数4个空格)
	fmt.Printf("%5.2f\n", x)      // 总宽度为5, 小数点后保留2位, 结果为 3.14(左数一个空格)
	fmt.Printf("%.3f\n", x)       // 保留3位小数
	fmt.Printf("%.2g\n", x)       // 共出现两个数字

	// 特殊用法
	fmt.Printf("%[1]*.[2]*[3]f\n", 5, 1, x) // 等同于 %5.1f, 由于使用了索引, 使用[]*区分, [num]* 表示宽度或者精度
}


string 相关用法

package main

import "fmt"

func main(){
	// 字符串
	s1 := "这是个字符串\"string1\""
	fmt.Printf("s1: %s\n", s1) // s1: 这是个字符串"string1"
	fmt.Printf("s1: %q\n", s1) // s1: "这是个字符串\"string1\""

	// 字符串跟长度
	fmt.Printf("s1: %20s\n", s1)    // 最小宽度为20
	fmt.Printf("s1: %-20s\n", s1)   // 最小宽度为20, 左对齐
	fmt.Printf("s1: %20.28s\n", s1) // 最小宽度.最大宽度, 默认右对齐
	fmt.Printf("s1: %-5.7s\n", s1)  // 左对齐
	fmt.Printf("s1: %020s\n", s1)   // 小于20前边补0
}


fmt.Scan - 捕获输入

package main

import "fmt"

func main() {
	var (
		name string
		age  int
	)

	// 将捕获到的输入赋值给指针, 没有提示, 可以使用空格或者回车表示输入下一个
	fmt.Scan(&name, &age)
	fmt.Println(name, age)

	// 必须按照这个格式去写才能捕获成功
	fmt.Scanf("name:%s age:%d\n", &name, &age)
	fmt.Println(name, age)

	// 只能使用空格, 回车则表示输入完成
	fmt.Scanln(&name, &age)
	fmt.Println(name, age)
}


fmt.Errorf - 输出报错信息

package main

import (
	"fmt"
	"os"
)

func main() {
	fileName := "a.txt"

	_, err := os.Open(fileName)

	if err != nil {
		panic(fmt.Errorf("打开文件 %s 失败, err: %v", fileName, err))
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值