Go 语言fmt 标准库格式化输出说明

Posted 沛沛老爹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 语言fmt 标准库格式化输出说明相关的知识,希望对你有一定的参考价值。

Go 语言的格式化输出。

不论变量的类型是什么,fmt.Printf 函数都支持以下通用的输出格式。

通用的格式化输出

  • %v,以默认的格式输出它的值。类型不同,默认格式也不同。
  • %#v,以 Go 的语法格式输出它的值。
  • %T,以 Go 的语法格式输出它的类型。
  • %%,输出百分号。

更多的可以查看源码(说真的,看源码可以省下很多时间),fmt中根据类型不同重写了很多针对的函数。

源码

源码位置

代码都是按照fmt[类型]来进行设置的。

bool 格式化

func (p *pp) fmtBool(v bool, verb rune) 
	switch verb 
	case 't', 'v':
		p.fmt.fmtBoolean(v)
	default:
		p.badVerb(verb)
	

uint64格式化

func (p *pp) fmt0x64(v uint64, leading0x bool) 
	sharp := p.fmt.sharp
	p.fmt.sharp = leading0x
	p.fmt.fmtInteger(v, 16, unsigned, 'v', ldigits)
	p.fmt.sharp = sharp

Int

// fmtInteger formats a signed or unsigned integer.
func (p *pp) fmtInteger(v uint64, isSigned bool, verb rune) 
	switch verb 
	case 'v':
		if p.fmt.sharpV && !isSigned 
			p.fmt0x64(v, true)
		 else 
			p.fmt.fmtInteger(v, 10, isSigned, verb, ldigits)
		
	case 'd':
		p.fmt.fmtInteger(v, 10, isSigned, verb, ldigits)
	case 'b':
		p.fmt.fmtInteger(v, 2, isSigned, verb, ldigits)
	case 'o', 'O':
		p.fmt.fmtInteger(v, 8, isSigned, verb, ldigits)
	case 'x':
		p.fmt.fmtInteger(v, 16, isSigned, verb, ldigits)
	case 'X':
		p.fmt.fmtInteger(v, 16, isSigned, verb, udigits)
	case 'c':
		p.fmt.fmtC(v)
	case 'q':
		p.fmt.fmtQc(v)
	case 'U':
		p.fmt.fmtUnicode(v)
	default:
		p.badVerb(verb)
	

float

func (p *pp) fmtFloat(v float64, size int, verb rune) 
	switch verb 
	case 'v':
		p.fmt.fmtFloat(v, size, 'g', -1)
	case 'b', 'g', 'G', 'x', 'X':
		p.fmt.fmtFloat(v, size, verb, -1)
	case 'f', 'e', 'E':
		p.fmt.fmtFloat(v, size, verb, 6)
	case 'F':
		p.fmt.fmtFloat(v, size, 'f', 6)
	default:
		p.badVerb(verb)
	

Complex

func (p *pp) fmtComplex(v complex128, size int, verb rune) 
	// Make sure any unsupported verbs are found before the
	// calls to fmtFloat to not generate an incorrect error string.
	switch verb 
	case 'v', 'b', 'g', 'G', 'x', 'X', 'f', 'F', 'e', 'E':
		oldPlus := p.fmt.plus
		p.buf.writeByte('(')
		p.fmtFloat(real(v), size/2, verb)
		// Imaginary part always has a sign.
		p.fmt.plus = true
		p.fmtFloat(imag(v), size/2, verb)
		p.buf.writeString("i)")
		p.fmt.plus = oldPlus
	default:
		p.badVerb(verb)
	

string

func (p *pp) fmtString(v string, verb rune) 
	switch verb 
	case 'v':
		if p.fmt.sharpV 
			p.fmt.fmtQ(v)
		 else 
			p.fmt.fmtS(v)
		
	case 's':
		p.fmt.fmtS(v)
	case 'x':
		p.fmt.fmtSx(v, ldigits)
	case 'X':
		p.fmt.fmtSx(v, udigits)
	case 'q':
		p.fmt.fmtQ(v)
	default:
		p.badVerb(verb)
	

… 还有更多的类型都是按照这种格式进行格式化的。

总结

  • 通用的格式输出可以使用%的方式来输出。 T代表Type;v 代表value。
  • 非通用的可以使用对应基础类型格式化函数。通用格式fmt[Type]。

以上是关于Go 语言fmt 标准库格式化输出说明的主要内容,如果未能解决你的问题,请参考以下文章

Go语言标准库之fmt

go语言标准库之fmt

12.Go语言标准库之fmt

Go Go 简单的很,标准库之 fmt 包的一键入门

Go Go 简单的很,标准库之 fmt 包的一键入门

Go Go 简单的很,标准库之 fmt 包的一键入门