TypechoJoeTheme

Toasobi的博客

7.27 常用标准库 - fmt

本文最后更新于2022年07月27日,已超过782天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

1.1.1向外输出

Print

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

Fprint

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

func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)

例子

// 向标准输出写入内容
fmt.Fprintln(os.Stdout, "向标准输出写入内容")
fileObj, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
    fmt.Println("打开文件出错,err:", err)
    return
}
name := "枯藤"
// 向打开的文件句柄中写入内容
fmt.Fprintf(fileObj, "往文件中写如信息:%s", name)

简单来说,前缀为F的输出函数会将数据输入到指定位置保存,在写入内容等方面应用(输入对象为os.Stdout时即输入到控制台)

Sprint

Sprint系列函数会把传入的数据生成并返回一个字符串。
下面是函数原型

func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string

举点例子

s1 := fmt.Sprint("枯藤")
s2 := fmt.Sprintf("name:%s,age:%d", name, age)
s3 := fmt.Sprintln("枯藤")

S前缀的输出返回为字符串类型

Errorf

Errorf函数根据format参数生成格式化字符串并返回一个包含该字符串的错误。
通常运用于自定义错误
err := fmt.Errorf("这是一个错误")

占位符

prinf系列函数用的格式化参数
标黄的为比较常用的


通用占位符

占位符说明
%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 默认小数点后保留6位
%F等价于%f
%g根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)
%G根据实际情况采用%E或%F格式(以获得更简洁、准确的输出)


字符串和[]byte

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

宽度标识符

宽度通过一个紧跟在百分号后面的十进制数指定,如果未指定宽度,则表示值时除必需之外不作填充。精度通过(可选的)宽度后跟点号后跟的十进制数指定。如果未指定精度,会使用默认精度;如果点号后没有跟数字,表示精度为0。举例如下

占位符说明
%f默认宽度,默认精度 即小数点保留6位
%9f宽度9,默认精度
%.2f默认宽度,精度2 即小数点保留2位
%9.2f宽度9,精度2 即小数点保留2位,前面宽度用空格占据
%9.f宽度9,精度0 即小数点保留0位,前面宽度用空格占据

其它占位符(这里简单解释)
若有一个字符串s,下面是普通格式化输出
fmt.Printf("%s\n", s) 在此基础上
“%5s\n”----占据5位,前三位用空格补上了(因为s只占两位)
“%-5s\n”----5位,但是左对齐
“%-5.2s\n”----和上面效果一样
“%05s\n”----占5位,前三位用0填充了

1.1.3

获取输入

fmt.Scan

函数原型(下面的衍生函数几乎差不多):
func Scan(a ...interface{}) (n int, err error)
Scan从标准输入扫描文本,读取由空白符分隔的值保存到传递给本函数的参数中,换行符视为空白符。(输入时各个不同数据中间要加空格)

示例:

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)
}

fmt.Scanf

相较于上面的函数,该函数按照指定格式读取
fmt.Scanf("1:%s 2:%d 3:%t", &name, &age, &married)
这时在输入时要按照指定格式输入

fmt.Scanln

Scanln类似Scan,它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。
只能读一行,但是比较常用

bufio.NewReader

可以指定读取截止的标志,适用于读取输入内容中有空格的完整内容

func bufioDemo() {
    reader := bufio.NewReader(os.Stdin) // 从标准输入生成读对象
    fmt.Print("请输入内容:")
    text, _ := reader.ReadString('\n') // 读到换行
    text = strings.TrimSpace(text)
    fmt.Printf("%#v\n", text)
}

注:中间的strings.TrimSpace()函数作用在笔记中已经记录

Fscan

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

Sscan

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

朗读
赞(1)
评论 (0)