Golang Printf,Sprintf,Fprintf 格式化详解

1.`Sprintf` 则格式化并返回一个字 符串而不带任何输出。

s := fmt.Sprintf("是字符串 %s ","string")

2. fmt.Println(s) // 是字符串 %s 对应 是字符串 string

3.可以使用 `Fprintf` 来格式化并输出

fmt.Fprintf(os.Stderr, "格式化 %s\n", "error")

顺带说一下格式化的符号:

/*
  %v 输出结构体 {10 30}
  %+v 输出结构体显示字段名 {one:10 tow:30}
  %#v 输出结构体源代码片段 main.Point{one:10, tow:30}
  %T 输出值的类型   main.Point
  %t 输出格式化布尔值  true
  %d`输出标准的十进制格式化 100
  %b`输出标准的二进制格式化 99 对应 1100011
  %c`输出定整数的对应字符 99 对应 c
  %x`输出十六进制编码 99 对应 63
  %f`输出十进制格式化 99 对应 63
  %e`输出科学技科学记数法表示形式 123400000.0 对应 1.234000e+08
  %E`输出科学技科学记数法表示形式 123400000.0 对应 1.234000e+08
  %s 进行基本的字符串输出 "\"string\"" 对应 "string"
  %q 源代码中那样带有双引号的输出 "\"string\"" 对应 "\"string\""
  %p 输出一个指针的值 &jgt 对应 0xc00004a090
  % 后面使用数字来控制输出宽度 默认结果使用右对齐并且通过空格来填充空白部分
  %2.2f 指定浮点型的输出宽度 1.2 对应 1.20
  %*2.2f 指定浮点型的输出宽度对齐,使用 `-` 标志 1.2 对应 *1.20
  */
 jgt := Point{10,30}
 fmt.Printf("%v\n",jgt)  // {10 30}
 fmt.Printf("%+v\n",jgt)  // {one:10 tow:30}
 fmt.Printf("%#v\n",jgt)  // main.Point{one:10, tow:30}
 fmt.Printf("%T\n",jgt)   // main.Point
 fmt.Printf("%t\n",true) // true
 fmt.Printf("%d\n",100)  // 100
 fmt.Printf("%b\n",99)  // 99 对应 1100011
 fmt.Printf("%c\n",99)  // 99 对应 c
 fmt.Printf("%x\n",99)  // 99 对应 63
 fmt.Printf("%f\n",99.9)  // 99.9 对应 99.900000
 fmt.Printf("%e\n",123400000.0)  // 123400000.0 对应 1.234000e+08
 fmt.Printf("%E\n",123400000.0)  // 123400000.0 对应 1.234000e+08
 fmt.Printf("%s\n","\"string\"") // "\"string\"" 对应 "string"
 fmt.Printf("%q\n","\"string\"") // "\"string\"" 对应 "string"
 fmt.Printf("%p\n",&jgt)    // &jgt 对应 0xc00004a090
 fmt.Printf("%6d\n",8)    // &jgt 对应 0xc00004a090
 fmt.Printf("%2.2f\n",1.2 )    // 1.2 对应 1.20
 fmt.Printf("*%2.2f\n",1.2 )    // 1.2 对应 *1.20

补充:Go 学习笔记:Println 与 Printf 的区别,以及 Printf 的详细用法

Println 与Printf 都是fmt 包中的公共方法,在需要打印信息时需要用到这二个函数,那么这二个函数有什么区别呢?

Println:可以打印出字符串,和变量

Printf :只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整形

也就是说,当需要格式化输出信息时一般选择 Printf,其他时候用 Println 就可以了,比如:

a := 10
fmt.Println(a)  //right
fmt.Println("abc")  //right
fmt.Printf("%d",a)  //right
fmt.Printf(a)  //error

Printf 详细用法

Printf 在使用时需要给它指定一个格式化规则,即第一个参数,那么一共有多少种格式呢,用的时候需要怎么写呢?

package main
import "fmt"
import "os"
type point struct {
 x, y int
}
func main() {
 //Go 为常规 Go 值的格式化设计提供了多种打印方式。例如,这里打印了 point 结构体的一个实例。
 p := point{1, 2}
 fmt.Printf("%v\n", p) // {1 2}
 //如果值是一个结构体,%+v 的格式化输出内容将包括结构体的字段名。
 fmt.Printf("%+v\n", p) // {x:1 y:2}
 //%#v 形式则输出这个值的 Go 语法表示。例如,值的运行源代码片段。
 fmt.Printf("%#v\n", p) // main.point{x:1, y:2}
 //需要打印值的类型,使用 %T。
 fmt.Printf("%T\n", p) // main.point
 //格式化布尔值是简单的。
 fmt.Printf("%t\n", true)
 //格式化整形数有多种方式,使用 %d进行标准的十进制格式化。
 fmt.Printf("%d\n", 123)
 //这个输出二进制表示形式。
 fmt.Printf("%b\n", 14)
 //这个输出给定整数的对应字符。
 fmt.Printf("%c\n", 33)
 //%x 提供十六进制编码。
 fmt.Printf("%x\n", 456)
 //对于浮点型同样有很多的格式化选项。使用 %f 进行最基本的十进制格式化。
 fmt.Printf("%f\n", 78.9)
 //%e 和 %E 将浮点型格式化为(稍微有一点不同的)科学技科学记数法表示形式。
 fmt.Printf("%e\n", 123400000.0)
 fmt.Printf("%E\n", 123400000.0)
 //使用 %s 进行基本的字符串输出。
 fmt.Printf("%s\n", "\"string\"")
 //像 Go 源代码中那样带有双引号的输出,使用 %q。
 fmt.Printf("%q\n", "\"string\"")
 //和上面的整形数一样,%x 输出使用 base-16 编码的字符串,每个字节使用 2 个字符表示。
 fmt.Printf("%x\n", "hex this")
 //要输出一个指针的值,使用 %p。
 fmt.Printf("%p\n", &p)
 //当输出数字的时候,你将经常想要控制输出结果的宽度和精度,可以使用在 % 后面使用数字来控制输出宽度。默认结果使用右对齐并且通过空格来填充空白部分。
 fmt.Printf("|%6d|%6d|\n", 12, 345)
 //你也可以指定浮点型的输出宽度,同时也可以通过 宽度.精度 的语法来指定输出的精度。
 fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)
 //要最对齐,使用 - 标志。
 fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)
 //你也许也想控制字符串输出时的宽度,特别是要确保他们在类表格输出时的对齐。这是基本的右对齐宽度表示。
 fmt.Printf("|%6s|%6s|\n", "foo", "b")
 //要左对齐,和数字一样,使用 - 标志。
 fmt.Printf("|%-6s|%-6s|\n", "foo", "b")
 //到目前为止,我们已经看过 Printf了,它通过 os.Stdout输出格式化的字符串。Sprintf 则格式化并返回一个字符串而不带任何输出。
 s := fmt.Sprintf("a %s", "string")
 fmt.Println(s)
 //你可以使用 Fprintf 来格式化并输出到 io.Writers而不是 os.Stdout。
 fmt.Fprintf(os.Stderr, "an %s\n", "error")
}

可以看到,这种类还是挺多的,但平时经常用的也就前面几种而已,或者可以说,用的最多的就是第一个

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 基于golang uint8、int8与byte的区别说明

    简单说明 uint8与byte可以说是一样的,因为文档中有这样的定义: The Go Programming Language Specification Numeric types uint8 the set of all unsigned 8-bit integers (0 to 255) byte alias for uint8 也就是说,我们在需要将这两种类型转换为string的时候都是可以直接使用string()来进行的. 而int8的取值范围为-128~127,所以int8不能直接与

  • golang创建文件目录os.Mkdir,os.MkdirAll的区别说明

    如下所示: os.Mkdir("abc", os.ModePerm) //创建目录 os.MkdirAll("dir1/dir2/dir3", os.ModePerm) //创建多级目录 首先,试图从一个Go可执行文件创建一组嵌套目录(如'dir1/dir2/dir3'),并打印错误出来看看. err:=os.Mkdir("dir1/dir2/dir3",os.ModePerm) if err!=nil{ fmt.Println(err) } r

  • golang 如何替换掉字符串里面的换行符\n

    原始字符串: -----BEGIN LICENSE KEY-----\nL/+HAwEBB2xpY2Vuc2UB/4gAAQIBB1BheWxvYWQBCgABCVNpZ25hdHVyZQEKAAAA\n/gPo/4gB/gHd/7AQABpsaWNlbnNlLW1nci9jb25maWcuUGF5bG9hZP+BAwEBB1Bh\neWxvYWQB/4IAAQoBBUFwcElkAQwAAQZBcHBLZXkBDAABCVN0YXJ0VGltZQEMAAEE\nRGF5cwEEAAEGQWVz

  • 解决golang gin框架跨域及注解的问题

    在golang的路上缓慢前进 Gin框架 跨域问题的解说与方法 代码如下: package main import ( "github.com/gin-gonic/gin" "awesomeProject/app/app_routers" "strings" "fmt" "net/http" ) /* 路由初始化*/ var ( engine = gin.Default() ) func main() {

  • golang 中的 nil的场景分析

    源码中的 nil 是这样定义的 // nil is a predeclared identifier representing the zero value for a // pointer, channel, func, interface, map, or slice type. var nil Type // Type must be a pointer, channel, func, interface, map, or slice type 所以 nil 可以理解为这些类型的零值,声明

  • 手把手教你vscode配置golang开发环境的步骤

    1.下载安装Golang https://golang.google.cn/dl/ 一路下一步即可 2.下载安装Vscode https://visualstudio.microsoft.com/zh-hans/ 3.检查Golang是否安装成功 4.设置Golang 环境变量 go env -w GO111MODULE=on Golang1.16默认开启,1.16一下需要执行这条命令 go env -w GOPROXY=https://goproxy.cn,direct 设置七牛CDN 我的环

  • Golang 并发以及通道的使用方式

    Golang最擅长的就是并发编程,使用Golang可以很方便的进行并发编程.先看一段普通的代码 package main import ( "fmt" "time" ) func Foo(i int) { fmt.Printf("%d will sleep\n", i) time.Sleep(5 * time.Second) fmt.Printf("%d wake up\n", i) } func main() { for i

  • Golang Printf,Sprintf,Fprintf 格式化详解

    1.`Sprintf` 则格式化并返回一个字 符串而不带任何输出. s := fmt.Sprintf("是字符串 %s ","string") 2. fmt.Println(s) // 是字符串 %s 对应 是字符串 string 3.可以使用 `Fprintf` 来格式化并输出 fmt.Fprintf(os.Stderr, "格式化 %s\n", "error") 顺带说一下格式化的符号: /* %v 输出结构体 {10 3

  • perl之print,printf,sprintf使用案例详解

    目录 print printf sprintf 区别 参考文档 详细用法,可以查看perl用户手册. perldoc -f print perldoc -f printf perldoc -f sprintf 他们各自支持的命令格式,都有三四种.但是常用的,也就一两种. print 常用: print LIST print FILEHANDLE LIST 不常用(主要是因为隐含的细节,会导致阅读上的障碍吧): print FILEHANDLE print print $foo; print "H

  • golang字符串本质与原理详解

    目录 一.字符串的本质 1.字符串的定义 2.字符串的长度 3.字符与符文 二.字符串的原理 1.字符串的解析 2.字符串的拼接 3.字符串的转换 总结 一.字符串的本质 1.字符串的定义 golang中的字符(character)串指的是所有8比特位字节字符串的集合,通常(非必须)是UTF-8 编码的文本. 字符串可以为空,但不能是nil. 字符串在编译时即确定了长度,值是不可变的. // go/src/builtin/builtin.go // string is the set of al

  • Golang分布式应用之Redis示例详解

    目录 正文 分布式锁 运行测试 分布式过滤器 运行测试 分布式限流器 运行测试 其他 正文 Redis作是一个高性能的内存数据库,常被应用于分布式系统中,除了作为分布式缓存或简单的内存数据库还有一些特殊的应用场景,本文结合Golang来编写对应的中间件. 本文所有代码见github.com/qingwave/go… 分布式锁 单机系统中我们可以使用sync.Mutex来保护临界资源,在分布式系统中同样有这样的需求,当多个主机抢占同一个资源,需要加对应的“分布式锁”. 在Redis中我们可以通过s

  • golang构建工具Makefile使用详解

    目录 正文 正文 可能是因为编译太简单了,golang 并没有一个官方的构建工具(类似于 java 的 maven 和 gradle之类的),但是除了编译,我们可能还需要下载依赖,运行测试,甚至像 easyjson,protobuf,thrift 这样的工具下载和代码生成,如果没有构建工具,这些工作就会非常麻烦 为了解决这个问题,之前写过一个 everything.sh 的脚本,把所有的操作都封装在这个脚本里面,只需要执行类似于 sh everything.sh dependency 的命令就可

  • Golang 内存管理简单技巧详解

    目录 引言 预先分配切片 结构中的顺序字段 使用 map[string]struct{} 而不是 map[string]bool 引言 除非您正在对服务进行原型设计,否则您可能会关心应用程序的内存使用情况.内存占用更小,基础设施成本降低,扩展变得更容易/延迟. 尽管 Go 以不消耗大量内存而闻名,但仍有一些方法可以进一步减少消耗.其中一些需要大量重构,但很多都很容易做到. 预先分配切片 数组是具有连续内存的相同类型的集合.数组类型定义指定长度和元素类型.数组的主要问题是它们的大小是固定的——它们

  • GoLang切片并发安全解决方案详解

    目录 1.介绍切片并发问题 2.实践检验真理 3.回答切片并发安全问题 4.解决切片并发安全问题方式 5.附 1.介绍切片并发问题 关于切片的,Go语言中的切片原生支持并发吗? 2.实践检验真理 实践是检验真理的唯一标准,所以当我们遇到一个不确定的问题,直接写demo来验证,因为切片的特点,我们可以分多种情况来验证 1.不指定索引,动态扩容并发向切片添加数据 2.指定索引,指定容量并发向切片添加数据 不指定索引,动态扩容并发向切片添加数据 不指定索引,动态扩容并发向切片添加数据: 通过打印数据发

  • GoLang内存泄漏原因排查详解

    目录 背景 临时性内存泄漏 通道理解 背景 Go 语言中有对应的Go 内存回收机制,在Go采用 并发三色标记清除  算法, 但是由于实际的过程中 发现会有一些内存泄漏的常见,内存泄漏 分为: 临时性 和 永久性内存泄漏. 初步排查过程中: 发现Linux使用top 发现内存随着时间会持续的增加没有稳定在一个合理值中. 在使用 pprof ,BBC 等 Go的内存泄漏工具进行排查 临时性内存泄漏 指的释放内存 不及时,对应的内存在更晚时候释放,这类问题主要是 string,slice 和底层的Bu

  • Golang Defer关键字特定操作详解

    Go语言中的defer关键字用于在函数返回前执行一些特定的操作.可以将defer看作是一种后置语句,在函数中的任何位置都可以使用. 下面是一个使用defer的例子: func foo() { defer fmt.Println("Done") fmt.Println("Hello") } 在上面的例子中,当函数foo被调用时,它会先输出"Hello",然后再输出"Done",因为"Done"被包装在defe

  • AngularJS 日期格式化详解

    AngularJS是为了克服HTML在构建应用上的不足而设计的.HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了.所以我做了一些工作(你也可以觉得是小花招)来让浏览器做我想要的事. AngularJS的日期格式化有两种形式,一种是在HTML页面,一种是在JS代码里,都是用到AngularJS的过滤器$filter. HTML: date_expression 即 你在$scope中设的date类型变量(注意,一定是date object才正确), 也是要显

随机推荐