Go語言學習(1)——標準庫fmt

PedroGao發表於2018-01-19

最近一直在學習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中輸出紅色的字),

Go語言學習(1)——標準庫fmt

當然還可以輸出黃色

func Yellow(message string) string {
	return fmt.Sprintf("\x1b[33m%s\x1b[0m", message)
}
複製程式碼

如果感興趣,讀者可以自己查閱一下讓自己的輸出更為優(zhuang)雅(bi)。

好了,關於fmt中常見的幾個函式今天邊介紹到這裡,餓死了(笑)。

相關文章