最近一直在学习Go语言,想通过以博客连载的形式来记录加深影响。好了闲话不多说,进入今天的正题。

Go语言的标准库强大而优美,不仅继承了C语言特点也很好的吸收了其他语言的精华。标准库fmt(format)让Go语言的标准输出更为方便和优雅。

首先,Go语言第一课,也是任何语言的第一课——Hello World!

package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}
复制代码

在上面的代码可以清楚的看到,Go语言输出HelloWorld需要用到标准库fmt.Println(),即print+line,意味输出一行。

当然在大多数情况,由于输出的复杂性,单单依靠Println()远远不够,这里Go语言另外的输出语句Printf()便可以解决绝大多数问题,也是用的最常见的输出语句。Printf()=print+format,即按照一定格式输出。

fmt.Printf("%s\n", "Hello World")
复制代码

这里我们可以用Printf()实现与Println()同样的功能。查看Go的源码我们知道无论是Printf()还是Println()都是调用Go语言fmt中另外的一个函数Fprintf()。

func Printf(format string, a ...interface{}) (n int, err error) {
	return Fprintf(os.Stdout, format, a...)
}
复制代码

上面即为Go语言源码中对Printf()的实现,Printf()将接收到string传递给了Fprintf(),由Fprintf()向标准输出流Stdout输出字符串。对于它,在Go源码的注释中可以看到下面一句话。

// Fprintf formats according to a format specifier and writes to w.

Fprintf()根据格式说明来将字符串拼接格式化并写到w中,这里的w指io.Writer,即为IO流的书写者。因为Go语言的接口的特性,只要实现了Writer接口便可以调用Fprintf()。也就是说Fprintf()是Go语言用于输入、出的标准函数,而Printf(),Println()只是Go语言实单纯对Stdout,也就是系统标准输出的实现。不仅如此,Go语言的错误输出Errorf()也是使用Fprintf()来实现的。

// Errorf formats according to a format specifier and returns the string
// as a value that satisfies error.
func Errorf(format string, a ...interface{}) error {
	return errors.New(Sprintf(format, a...))
}
复制代码

Fprintf()还可以用于标准网络输出,当然由于Fprintf()涉及Go语言其他的标准库,笔者会在后面介绍。

在Go语言fmt库里面还有另外一个成员Sprintf(),它依旧会输入格式化字符串,但它并不输出而是把得到的字符串返回给用户自己。

// 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
}
复制代码

上面是Go语言对于它实现的源码,如果某些读者不理解,便可跳过,只需明白它会返回你所需要的格式的字符串。有了它,我们可以实现一些有趣的事情,如我们可以把输出的东西变为红色。

func Red(message string) string {
	return fmt.Sprintf("\x1b[31m%s\x1b[0m", message)
}
复制代码

上段代码中,Red()函数接受输入的字符串并将其变为红色返回(这里的红色,指的是在terminal中输出红色的字),



当然还可以输出黄色

func Yellow(message string) string {
	return fmt.Sprintf("\x1b[33m%s\x1b[0m", message)
}
复制代码

如果感兴趣,读者可以自己查阅一下让自己的输出更为优(zhuang)雅(bi)。

好了,关于fmt中常见的几个函数今天边介绍到这里,饿死了(笑)。